Android LiveData - 如何在不同的活动中重用相同的 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 接收更改。那可能吗?

原文由 user1209216 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 453
2 个回答

When you call ViewModelProviders.of(this) , you actually create/retain a ViewModelStore which is bound to this , so different Activities have different ViewModelStore and each ViewModelStore creates a different instance of a ViewModel using a given factory, so you can not have the same instance of a ViewModel in different ViewModelStore s。

但是您可以通过传递充当单例工厂的自定义 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 是一种反模式。强烈建议保留您的数据层对象(例如,使您的数据源或存储库单例)并在不同范围(活动)之间保留您的数据。

阅读 这篇 文章了解详情。

原文由 Saeed Masoumi 发布,翻译遵循 CC BY-SA 3.0 许可协议

当使用您作为生命周期所有者传递给 MainActivity 的 ViewModelProviders 获取视图模型时,这将为该活动提供视图模型。在第二个活动中,您将获得该 ViewModel 的另一个实例,这次是您的第二个活动。第二个模型将有第二个实时数据。

您可以做的是将数据维护在不同的层中,例如存储库,它可能是单例,这样您就可以使用相同的视图模型。

在此处输入图像描述

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

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

//SingleTon
public class DataRepository

    private MutableLiveData<String> mCurrentName;

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

原文由 TotoliciCristian 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题