通过视图模型与 hiltviewmodel

问题描述 投票:0回答:2

当我想在不同视图之间共享视图模型时,我会使用

by viewmodels
。我最近开始研究刀柄,想知道
hiltviewmodel
是否能完成同样的事情?那是为了允许我共享视图模型的单个(同一实例)?

android android-jetpack dagger-hilt
2个回答
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
            ) {
                
            }
        }
    }

文档: 手柄和导航

使用 Navigation Compose 时,请始终使用 hiltViewModel 可组合项 函数获取 @HiltViewModel 注释的实例 视图模型。这适用于带注释的片段或活动 与@AndroidEntryPoint。


0
投票

标有

@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

© www.soinside.com 2019 - 2024. All rights reserved.