2017-08-20 105 views
3

我想围绕新的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); 

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

+0

你想为不同的'Fragment'实例使用不同的'ViewModel's?然后使用'ViewModelProvider#get(String key,Class modelClass)' – pskink

+0

@pskink我可能有点不清楚,对此感到抱歉。我的问题是,在片段中使用'ViewModelProviders.of(getActivity())'将它耦合到父活动,并防止在其他位置以独立方式使用片段(即'ViewModelProviders.of(this)')。我在质疑这个片段是否应该是决定谁拥有它所处理状态的人。在我看来,片段的拥有者(包含活动或另一个父片段)应对此选择负责。这是否澄清事情? – jwueller

+0

好吧,ViewModelProviders#方法只是在大多数情况下可以使用的工具,如果你需要更多的控制,你总是可以使用两个'ViewModelProvider'构造函数中的一个,通过'ViewModelStoreOwner'接口(例如'应用程序或某个单例)或者'ViewModelStore',如果你有一个,它的缺点是你也需要传递'ViewModelProvider.Factory',但是在这里你可以使用现有的'ViewModelProvider.NewInstanceFactory'或'ViewModelProviders.DefaultFactory' – pskink

回答

0

说出viewModel = ViewModelProviders.of(getActivity()).get(SomeViewModel.class);意味着您想将ViewModel的状态限定在活动范围内。如果您不希望片段被限制在活动范围内,您可以致电viewModel = ViewModelProviders.of(this).get(SomeViewModel.class);。现在你所做的只是if (shareState)然后打电话给第一个,如果不打电话给第二个。