ActivityViewModels 和惰性 ViewModelProvider 之间的区别?

Difference between ActivityViewModels and lazy ViewModelProvider?

ActivityViewModels 和惰性 ViewModelProvider 之间的区别?

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

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

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

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

当你调用ViewModelProvider(this)时,this指的是ViewModelStoreOwner

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

现在进入问题。

当你打电话时

private val someOtherViewModel: SomeOtherViewModel by lazy {
  ViewModelProvider(this).get(SomeOtherViewModel::class.java)
}

您将获得一个范围限定为当前 Fragment/Activity 的 ViewModel。 Lazy 只是推迟初始化。

当你打电话时

private val someViewModel: SomeViewModel by activityViewModels()

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