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单例)并在不同的作用域(活动)之间保留数据。

阅读此文章的详细信息。

以上是 Android LiveData-如何在不同活动中重用相同的ViewModel? 的全部内容, 来源链接: utcz.com/qa/425869.html

回到顶部