如何正确地调整ViewModels的范围?

时间:2017-08-20 12:16:18

标签: architecture android

我试图围绕新的Android架构组件,特别是ViewModel。

我的印象是片段不应该知道它所拥有的Activity或Fragment,因此它可以在应用程序的不同上下文中使用。这些示例似乎与此相矛盾,方法是直接在Fragment中声明ViewModel范围,而不是片段所有者:

viewModel = ViewModelProviders.of(getActivity()).get(SomeViewModel.class);

我希望能够在Master / Detail配置中使用此Fragment,其中两者共享相同的状态(即ViewModel实例),以及ViewPager内部,其中所有Fragments都需要单独的状态(即单独的ViewModel实例) )。我希望Fragment所有者能够决定范围,这种方法似乎不支持。

我想出的一种解决方法是,可以选择传入已配置的ViewModelProvider,以便在必要时显式扩展ViewModel的范围(例如,在Master / Detail配置中),并默认使用单独的ViewModel:

final ViewModelProvider viewModelProvider;
if (viewModelProviderOverride != null) {
    viewModelProvider = viewModelProviderOverride;
} else {
    viewModelProvider = ViewModelProviders.of(this);
}

viewModel = viewModelProvider.get(SomeViewModel.class);

这样,所有者可以决定是否多个片段将共享其状态。我还没有完全想到这一点,但它似乎有点可疑,因为在文档中似乎没有任何接近它的东西。我觉得我错过了一些明显的东西。

1 个答案:

答案 0 :(得分:1)

viewModel = ViewModelProviders.of(getActivity()).get(SomeViewModel.class);表示您希望将ViewModel的状态限定为活动。如果您不希望将片段限定为活动范围,则可以调用viewModel = ViewModelProviders.of(this).get(SomeViewModel.class);。现在你所做的只是if (shareState)然后调用第一个,如果没有调用第二个。