繁体   English   中英

片段中的 ViewModelProvider 使用什么 ViewModelStoreOwner?

[英]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实例的ActivityFragment的场景。

但是“没有例外,没有规则”,您的场景类似于Activity有两个Fragment需要共享数据的场景。

在这种情况下,可以为ViewModel使用Activity scope 以确保每个组件都可以访问同一个实例。 另请参阅developer.android.com的视图 Model 概述中的“片段之间共享数据”部分

我认为您收到错误不是因为您的 ViewModel class。 我删除了除构造函数之外的所有代码,只保留了一个简单的 class。 它工作正常。 如果您遵循 MVVM 模式,那么您可能会因为数据库实现而出错,或者您可能会检查存储库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM