当我想在不同视图之间共享视图模型时,我会使用
by viewmodels
。我最近开始研究刀柄,想知道 hiltviewmodel
是否能完成同样的事情?那是为了允许我共享视图模型的单个(同一实例)?
通过 viewModels():
= hiltViewModel():
你最好构建一个演示并练习它,并记录实例以查看是否是同一个实例。
val viewModel: ViewModelA by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
HiltDemoTheme {
val viewModel2: ViewModelA = hiltViewModel()
val viewModel3: ViewModelA = viewModel()
val viewModel4: ViewModelA by viewModels()
Log.d("Jeck", "$viewModel")
Log.d("Jeck", "$viewModel2")
Log.d("Jeck", "$viewModel3")
Log.d("Jeck", "$viewModel4")// the four get the same instance
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colors.background
) {
}
}
}
文档: 手柄和导航
使用 Navigation Compose 时,请始终使用 hiltViewModel 可组合项 函数获取 @HiltViewModel 注释的实例 视图模型。这适用于带注释的片段或活动 与@AndroidEntryPoint。
标有
@HiltViewModel
注释的 ViewModel 将可供 HiltViewModelFactory
创建,并且默认情况下可以使用 @AndroidEntryPoint
或 ViewModelProvider
在标有 by viewModels()
注释的 Activity 或片段中检索。
此外,
by viewModels
返回一个属性委托来访问默认范围为片段的ViewModel。请记住 viewModels
不仅可以与 Hilt 一起使用,而且在不使用 Hilt 时也可以用于提供简单的 ViewModel 实例。
另一方面,
@HiltViewModel
,告诉 Hilt 此 ViewModel 可以注入到其他标有 @AndroidEntryPoint
的类中,并允许 Hilt 将其他依赖项注入到此 ViewModel 中。
所有 Hilt ViewModel 均由 ViewModelComponent 提供,该组件遵循与 ViewModel 相同的生命周期,因此可以在配置更改后继续存在。要确定对 ViewModel 的依赖关系范围,请使用 @ViewModelScoped 注释。
@ViewModelScoped 类型将使作用域类型的单个实例在注入 ViewModel 的所有依赖项中提供。请求作用域实例的 ViewModel 的其他实例将收到不同的实例。
如果单个实例需要在不同的 ViewModel 之间共享,那么应该使用 @ActivityRetainedScoped 或 @Singleton 来确定其范围。
[来源:https://developer.android.com/training/dependency-injection/hilt-jetpack#viewmodelscoped]
如果共享/单个ViewModel位于不同的fragment之间,您可以通过
by activityViewModels
将注入的ViewModel的生命周期绑定到父Activity。
更多信息:
https://dagger.dev/api/latest/dagger/hilt/android/lifecycle/HiltViewModel.html &
https://dagger.dev/hilt/view-model.html &
https://developer.android.com/training/dependency-injection/hilt-jetpack