android – 在不同Activity中的片段之间共享ViewModel

我有一个名为SharedViewModel的ViewModel:

public class SharedViewModel<T> extends ViewModel {

    private final MutableLiveData<T> selected = new MutableLiveData<>();


    public void select(T item) {
        selected.setValue(item);
    }

    public LiveData<T> getSelected() {
        return selected;
    }
}

我在Google的Arch ViewModel参考页面上基于SharedViewModel示例实现它:

https://developer.android.com/topic/libraries/architecture/viewmodel.html#sharing_data_between_fragments

It is very common that two or more fragments in an activity need to communicate with each other. This is never trivial as both
fragments need to define some interface description and the owner
activity must bind the two together. Moreover, both fragments must
handle the case where the other fragment is not yet created or not
visible.

我有两个片段,名为ListFragment和DetailFragment.

到目前为止,我在一个名为MasterActivity的内部使用了这两个片段.一切都运作良好.

我在ListFragment中获得了ViewModel,选择了在DetailFragment上使用它的值.

mStepSelectorViewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);

但是,现在我需要在某些情况下将ListFragment(布局到不同的设备配置)添加到名为DetailActivity的不同活动中.有没有办法像上面的例子那样做?

最佳答案
稍晚但您可以使用共享的ViewModelStore来完成此操作.片段和活动实现ViewModelStoreOwner接口.在这些情况下,片段每个实例都有一个存储,并且活动将它保存在静态成员中(我猜它可以在配置更改中存活).

回到共享的ViewModelStore,比如说你希望它是你的Application实例.您需要应用程序来实现ViewModelStoreOwner.

class MyApp: Application(), ViewModelStoreOwner {
    private val appViewModelStore: ViewModelStore by lazy {
        ViewModelStore()
    }

    override fun getViewModelStore(): ViewModelStore {
        return appViewModelStore
    }
}

然后,如果您知道需要在活动边界之间共享ViewModel,则可以执行此类操作.

val viewModel = ViewModelProvider(myApp, viewModelFactory).get(CustomViewModel::class.java)

所以现在它将使用您的应用中定义的商店.这样你就可以共享ViewModels.

很重要.因为在此示例中ViewModel存在于您的应用程序实例中,所以当使用它们的片段/活动被销毁时,它们不会被销毁.因此,您必须将它们链接到将使用它们的最后一个片段/活动的生命周期,或者手动销毁它们.

点击查看更多相关文章

转载注明原文:android – 在不同Activity中的片段之间共享ViewModel - 乐贴网