Android LiveData-如何在不同活动中重用相同的ViewModel?


问题内容

示例ViewModel:

public class NameViewModel extends ViewModel {
    // Create a LiveData with a String
    private MutableLiveData<String> mCurrentName;

    public MutableLiveData<String> getCurrentName() {
        if (mCurrentName == null) {
            mCurrentName = new MutableLiveData<>();
        }
        return mCurrentName;
    }

}

主要活动:

mModel = ViewModelProviders.of(this).get(NameViewModel.class);

// Create the observer which updates the UI.
final Observer<String> nameObserver = textView::setText;

// Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
mModel.getCurrentName().observe(this, nameObserver);

我想调用mModel.getCurrentName().setValue(anotherName);第二个活动并使MainActivity接收更改。那可能吗?


问题答案:

调用时ViewModelProviders.of(this),您实际上创建/保留了ViewModelStore绑定到的this,因此不同的Activity具有不同的特性,ViewModelStore并且每个Activity
使用给定的工厂ViewModelStore创建a的不同实例ViewModel,因此您不能ViewModel在不同的ViewModelStores中具有相同的a实例。

但是,您可以通过传递自定义ViewModel工厂的单个实例(充当单例工厂)来实现此目的,因此它将始终ViewModel在不同活动之间传递您的同一实例。

例如:

public class SingletonNameViewModelFactory extends ViewModelProvider.NewInstanceFactory {


    NameViewModel t;

    public SingletonNameViewModelFactory() {
      //  t = provideNameViewModelSomeHowUsingDependencyInjection
    }

    @Override
    public NameViewModel create(Class<NameViewModel> modelClass) {
        return t;
    }
}

因此,您需要制作SingletonNameViewModelFactory单例(例如,使用Dagger)并像这样使用它:

mModel = ViewModelProviders.of(this,myFactory).get(NameViewModel.class);

注意:

ViewModel在不同范围之间保留s是一种反模式。强烈建议保留您的数据层对象(例如,使您的DataSource或Repository单例)并在不同的作用域(活动)之间保留数据。

阅读文章的详细信息。