【问题标题】:Share data between different ViewModels using a Shared ViewModel in Android在 Android 中使用 Shared ViewModel 在不同 ViewModel 之间共享数据
【发布时间】:2020-03-08 04:06:09
【问题描述】:

我有多个片段,每个片段都有不同的ViewModel。现在我想避免在我的Fragments 之间传递数据作为参数,而是在我的Viewmodels 之间使用SharedViewModel,并以某种方式继承Sharedviewmodel 来更新我的数据状态。有什么帮助吗?

【问题讨论】:

  • 我听说片段可以有一个共享视图模型和一个私有视图模型,并且由 Viewmodel Provider 提供。我只是不确定如何实现

标签: android mvvm


【解决方案1】:

ViewModel 继承可能是错误的工具,因为 ViewModel 被设计为与特定 Fragment 或 Activity 的生命周期相关联。更好的方法是拥有一个真正的“模型”类来管理各个 ViewModel 与之交互的持久数据状态(单例或其他)。例如:

class Database {

    private static Database instance = null;

    public static synchronized Database getInstance() {
        if( instance == null ) {
            instance = new Database();
        }
        return instance;
    }

    private Database() {}

    private int mValue = 0;
    public void setValue(int v) { mValue = v; }
    public int getValue() { return mValue; }
}


class FragmentAViewModel extends ViewModel {

    private final Database db;

    FragmentAViewModel() {
        db = Database.getInstance();
    }

    // FragmentA can set and get state on Database as needed
    void setValue(int v) {
        db.setValue(v);
    }
}

class FragmentBViewModel extends ViewModel {

    private final Database db;

    FragmentBViewModel() {
        db = Database.getInstance();
    }

    // FragmentB can set and get state on Database as needed
    int getValue() {
        return db.getValue();
    }
}

另一种选择是创建一个 Activity 级别的 ViewModel。如果所有片段都在同一个活动中,它们可以共享该活动视图模型。例如:

mFragmentViewModel = ViewModelProviders.of(this).get(FragmentViewModel.class);

MainActivity a = (MainActivity)requireActivity();
mActivityViewModel = ViewModelProviders.of(a).get(MainActivityViewModel.class);

【讨论】:

  • 我试图避免使用存储库
  • 如果您尝试创建一个超过给定片段或活动生命周期的类,那么这就是您所描述的。 ViewModel 是一个生命周期感知组件。
猜你喜欢
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 2011-05-24
  • 2015-12-06
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2022-11-10
相关资源
最近更新 更多