ActivityViewModel 和惰性 ViewModelProvider 之间的区别?

dba*_*nes 20 android kotlin android-viewmodel

ActivityViewModel 和惰性 ViewModelProvider 之间的区别?

我见过两种初始化视图模型的方法:

private val someViewModel: SomeViewModel by activityViewModels()
private val someOtherViewModel: SomeOtherViewModel by lazy {
        ViewModelProvider(this).get(SomeOtherViewModel::class.java)
}
Run Code Online (Sandbox Code Playgroud)

我知道lazy仅在需要时才初始化 ViewModel,这activityViewModels对于在片段之间共享数据很有用,但除此之外还有什么区别?

Android 文档说其activityViewModels范围仅限于 Activity,但这是否意味着如果在同一 Activity 内的多个片段中使用相同的视图模型,activityViewModels并且只创建一个在所有片段之间共享的实例?

Sub*_*Sen 37

当你打电话时ViewModelProvider(this)this指的是ViewModelStoreOwner

对于每个唯一的 ViewModelStoreOwner,将有一个给定的唯一 ViewModel type

现在来回答这个问题。

你打电话时

private val someOtherViewModel: SomeOtherViewModel by lazy {
  ViewModelProvider(this).get(SomeOtherViewModel::class.java)
}
Run Code Online (Sandbox Code Playgroud)

您将获得一个范围仅限于当前片段/活动的 ViewModel。Lazy只是推迟初始化。

你打电话时

private val someViewModel: SomeViewModel by activityViewModels()
Run Code Online (Sandbox Code Playgroud)

您将获得一个仅限于 Activity 范围的 ViewModel。当多个片段使用相同的代码时,它们会请求作用域为父 Activity 的 ViewModel。如果所有 Fragments 的父 Activity 相同,则 Fragments 将获得相同的 ViewModel,因为ViewModelStoreOwner与 Activity 的连接保持不变。