如何正确确定ViewModel的范围?

jwu*_*ler 5 architecture android

我试图围绕新的Android体系结构组件,特别是ViewModel展开思考。

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

viewModel = ViewModelProviders.of(getActivity()).get(SomeViewModel.class);
Run Code Online (Sandbox Code Playgroud)

我希望能够在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);
Run Code Online (Sandbox Code Playgroud)

这样,所有者可以决定是否多个片段将共享其状态。我还没有完全考虑到这一点,但是似乎有点可疑,因为文档中似乎没有暗示它。我觉得我缺少明显的东西。

Hay*_*Kai 2

表示viewModel = ViewModelProviders.of(getActivity()).get(SomeViewModel.class);您希望将 的状态ViewModel限制在 Activity 范围内。如果您不希望片段的范围仅限于活动,您可以调用viewModel = ViewModelProviders.of(this).get(SomeViewModel.class);. 现在您要做的就是if (shareState)调用第一个,如果没有调用第二个。