我想围绕新的Android体系结构组件,特别是ViewModel包围我的头。如何正确确定ViewModels的范围?
我的印象是,片段不应该知道它所拥有的Activity或Fragment,以便它可以在应用程序的不同上下文中使用。这些例子似乎直接在片段声明视图模型的范围,而不是片段业主反驳这个:
viewModel = ViewModelProviders.of(getActivity()).get(SomeViewModel.class);
我希望能在主/明细配置中使用该片段,其中两个共享相同的状态(即ViewModel实例),以及ViewPager中的所有Fragments都需要单独的状态(即单独的ViewModel实例)。我希望Fragment所有者能够规定范围,但似乎并没有采用这种方法。
我提出了一种解决方法可以是任选在一个配置ViewModelProvider通明确地扩大一个ViewModel的范围如果必要的话(例如,在主/从配置)和具有单独的ViewModels默认:
final ViewModelProvider viewModelProvider;
if (viewModelProviderOverride != null) {
viewModelProvider = viewModelProviderOverride;
} else {
viewModelProvider = ViewModelProviders.of(this);
}
viewModel = viewModelProvider.get(SomeViewModel.class);
这样,所有者可以决定多个碎片是否会共享其状态。我还没有完全想到这一点,但似乎有点可疑,因为似乎没有任何接近它的文件暗示在文档中。我觉得我失去了一些明显的东西。
你想为不同的'Fragment'实例使用不同的'ViewModel's?然后使用'ViewModelProvider#get(String key,Class modelClass)' –
pskink
@pskink我可能有点不清楚,对此感到抱歉。我的问题是,在片段中使用'ViewModelProviders.of(getActivity())'将它耦合到父活动,并防止在其他位置以独立方式使用片段(即'ViewModelProviders.of(this)')。我在质疑这个片段是否应该是决定谁拥有它所处理状态的人。在我看来,片段的拥有者(包含活动或另一个父片段)应对此选择负责。这是否澄清事情? – jwueller
好吧,ViewModelProviders#方法只是在大多数情况下可以使用的工具,如果你需要更多的控制,你总是可以使用两个'ViewModelProvider'构造函数中的一个,通过'ViewModelStoreOwner'接口(例如'应用程序或某个单例)或者'ViewModelStore',如果你有一个,它的缺点是你也需要传递'ViewModelProvider.Factory',但是在这里你可以使用现有的'ViewModelProvider.NewInstanceFactory'或'ViewModelProviders.DefaultFactory' – pskink