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
保持不变。
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
保持不变。