[英]What is the difference between passing“this” and “activity!!” as a ViewModelStoreOwner while creating ViewModelProvider instance
[英]What ViewModelStoreOwner to use for ViewModelProvider in Fragment?
我创建了一个测试活动来更新 MyViewModel 中的一些文本。
我想在Fragment中观察这些变化,但是当我使用
MyViewModel myViewModel = new ViewModelProvider(this).get(MyViewModel.class);
它给了我一个与活动中使用的不同的 MyViewModel 实例,这导致我在片段中的onChanged()
回调没有被调用。
只有当我将相同的片段代码修改为
HomeViewModel homeViewModel = new ViewModelProvider(getActivity()).get(HomeViewModel.class);
片段是否获得与活动相同的 MyViewModel 实例 - 所以onChanged()
被成功调用。
但是,我不确定使用getActivity()
作为 ViewModelStoreOwner 是否是正确的做事方式,因为我在任何地方的任何示例中都没有看到这一点。 我想知道在这种情况下是否应该使用更好的 ViewModelStoreOwner ?
我想知道在这种情况下是否应该使用更好的 ViewModelStoreOwner ?
您应该使用activity
实例在同一活动中的片段之间共享同一实例。
Activity 和Fragment都实现了自己的ViewModelStoreOwner接口,并实现了getViewModelStore()
方法。 getViewModelStore()
提供ViewModelStore
实例,该实例用于存储由viewmodel
创建的视图ViewModelProvider
对象。
注意: ComponentActivity实现ViewModelStoreOwner
接口, FragmentActivity
(AppCompatActivity 的父级)继承实现。
因此 Activity 和 Fragment 都有ViewModelStoreOwner
接口方法的特定实现,并根据对象的lifecycle
(包括配置更改)存储 viewmodel 实例。
由于片段属于活动,因此获取相同的活动实例,因此使用getActivity()
将导致使用活动的ViewModelStoreOwner
object。 要在片段之间共享对象,只需使用活动实例创建ViewModelProvider
,它将在所有片段中使用相同的ViewModelStoreOwner
,因此将返回视图模型的持久viewmodel
(如果之前创建)。
一段时间以来,拥有尽可能少的Activity
已成为“最佳实践”,因此许多指南可能不会涵盖需要访问同一ViewModel
实例的Activity
和Fragment
的场景。
但是“没有例外,没有规则”,您的场景类似于Activity
有两个Fragment
需要共享数据的场景。
在这种情况下,可以为ViewModel
使用Activity
scope 以确保每个组件都可以访问同一个实例。 另请参阅developer.android.com的视图 Model 概述中的“片段之间共享数据”部分
我认为您收到错误不是因为您的 ViewModel class。 我删除了除构造函数之外的所有代码,只保留了一个简单的 class。 它工作正常。 如果您遵循 MVVM 模式,那么您可能会因为数据库实现而出错,或者您可能会检查存储库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.