通过 viewmodels 与 hiltviewmodel

jam*_*mes 8 android android-jetpack dagger-hilt

当我想在不同视图之间共享视图模型时,我会使用by viewmodels. 我最近开始研究刀柄,想知道是否hiltviewmodel能完成同样的事情?那是为了让我共享视图模型的单个(同一实例)?

Jec*_*nly 7

通过 viewModels():

  1. 财产代表。
  2. 第一次创建,下次返回相同的实例(在相同的范围内,范围是相同的活动)

= hiltViewModel():

  1. 只在@Composable注解的函数中使用。
  2. 第一次创建,下次返回相同的实例(在同一范围内,范围是NavGraph,如果没有图形,则片段/活动)

你最好构建一个演示并练习它,并记录实例以查看是否相同的实例。

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 注释的片段或活动。


Dr.*_*cky 0

注释的 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