为什么在 Jetpack Compose 中使用 Hilt 作为依赖注入时不能自动创建 ViewModel 对象?
Why can't the ViewModel object be created automatically when I use Hilt as Dependency Injection in Jetpack Compose?
以下代码A来自官方样本project.
该项目使用 Hilt 作为依赖注入。
在我看来,我不需要自己创建 ViewModel
对象,因为 Hilt 会自动创建它。
但是在代码A中,好像viewModel: MainViewModel = viewModel()
必须手动创建,为什么?
代码A
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun CraneHomeContent(
onExploreItemClicked: OnExploreItemClicked,
openDrawer: () -> Unit,
modifier: Modifier = Modifier,
viewModel: MainViewModel = viewModel(),
) {
...
}
@HiltViewModel
class MainViewModel @Inject constructor(
private val destinationsRepository: DestinationsRepository,
@DefaultDispatcher private val defaultDispatcher: CoroutineDispatcher
) : ViewModel() {
...
}
@HiltAndroidApp
class CraneApplication : Application()
通过手动创建,我的意思是调用视图模型构造函数。而这在Hilt上是没有实践的,因为你必须把所有的注入都传递下去。
您不能只声明 viewModel: MainViewModel
参数,因为那样您必须从调用视图传递它。
viewModel()
为您完成所有注入魔法。此外,如果视图模型已经存在,将返回相同的对象。所以它是完全自动的。
以下代码A来自官方样本project.
该项目使用 Hilt 作为依赖注入。
在我看来,我不需要自己创建 ViewModel
对象,因为 Hilt 会自动创建它。
但是在代码A中,好像viewModel: MainViewModel = viewModel()
必须手动创建,为什么?
代码A
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun CraneHomeContent(
onExploreItemClicked: OnExploreItemClicked,
openDrawer: () -> Unit,
modifier: Modifier = Modifier,
viewModel: MainViewModel = viewModel(),
) {
...
}
@HiltViewModel
class MainViewModel @Inject constructor(
private val destinationsRepository: DestinationsRepository,
@DefaultDispatcher private val defaultDispatcher: CoroutineDispatcher
) : ViewModel() {
...
}
@HiltAndroidApp
class CraneApplication : Application()
通过手动创建,我的意思是调用视图模型构造函数。而这在Hilt上是没有实践的,因为你必须把所有的注入都传递下去。
您不能只声明 viewModel: MainViewModel
参数,因为那样您必须从调用视图传递它。
viewModel()
为您完成所有注入魔法。此外,如果视图模型已经存在,将返回相同的对象。所以它是完全自动的。