android - ActivityViewModels 和惰性 ViewModelProvider 的区别?

标签 android kotlin android-viewmodel

ActivityViewModels 和惰性 ViewModelProvider 的区别?
我见过两种初始化 View 模型的方法:

private val someViewModel: SomeViewModel by activityViewModels()
private val someOtherViewModel: SomeOtherViewModel by lazy {
        ViewModelProvider(this).get(SomeOtherViewModel::class.java)
}
我知道lazy仅在需要时初始化 ViewModel 并且 activityViewModels对于在 fragment 之间共享数据很有用,但除此之外有什么区别?
Android 文档说 activityViewModels被限定在 Activity 范围内,但这是否意味着如果使用 activityViewModels 在同一 Activity 内的多个 fragment 中使用相同的 View 模型是否只创建了一个在所有 fragment 之间共享的实例?

最佳答案

当您调用 ViewModelProvider(this) , thisViewModelStoreOwner .
对于每个唯一的 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。当多个 Fragment 使用相同的代码时,它们正在请求范围为父 Activity 的 ViewModel。如果所有 Fragment 的父 Activity 相同,则 Fragments 将获得相同的 ViewModel,因为 ViewModelStoreOwner连接到 Activity 保持不变。

关于android - ActivityViewModels 和惰性 ViewModelProvider 的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68058302/

相关文章:

java - 如何检测照片是否垂直拍摄? (我找到了方法,但行不通)

java - 无法获取 HTML 元素 (JSOUP)

android - Unresolved reference : findViewById in Kotlin

android - 我需要迁移才能将类型 Int 更改为 Long 吗?

android - 清除共享 View 模型

android - ViewModel体系结构困境

android - Phonegap 地理定位有时无法在 Android 上运行

java - 使用 ListView 获得不同的 ImageView 大小

Java 注释无法从 Kotlin 项目 jar 中使用

android - Dagger-Hilt:@ViewModelInject 没有注入(inject) MyViewModel 并崩溃?