jam*_*mes 8 android android-jetpack dagger-hilt
当我想在不同视图之间共享视图模型时,我会使用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
) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
文档: 手柄和导航
使用 Navigation Compose 时,请始终使用 hiltViewModel 可组合函数来获取 @HiltViewModel 注解的 ViewModel 的实例。这适用于使用 @AndroidEntryPoint 注释的片段或活动。
注释的 ViewModel@HiltViewModel将可供 进行创建,并且默认情况下可以通过使用或 来HiltViewModelFactory在注释的 Activity 或片段中检索。@AndroidEntryPointViewModelProviderby viewModels()
此外,by viewModels返回一个属性委托来访问默认范围为片段的 ViewModel。RememberviewModels不仅与 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 之间,您可以通过 . 将注入的 ViewModel 的生命周期绑定到父 Activity by activityViewModels。
更多信息:
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
| 归档时间: |
|
| 查看次数: |
2305 次 |
| 最近记录: |