【问题标题】:Why pass the dependencies to the viewmodel via the fragment?为什么要通过片段将依赖项传递给视图模型?
【发布时间】:2018-02-27 23:39:14
【问题描述】:

我正在研究 Google 的 Android 蓝图 MVVM 数据绑定示例 (https://github.com/googlesamples/android-architecture/tree/todo-mvvm-databinding/)

我注意到视图模型的依赖项是通过片段传递的。

public static TaskDetailFragment newInstance(String taskId) {
    Bundle arguments = new Bundle();
    arguments.putString(ARGUMENT_TASK_ID, taskId);
    TaskDetailFragment fragment = new TaskDetailFragment();
    fragment.setArguments(arguments);
    return fragment;
}

@Override
public void onResume() {
    super.onResume();
    mViewModel.start(getArguments().getString(ARGUMENT_TASK_ID));
}

上例中的任务id不能传入viewmodel的构造函数吗?并且片段忘记了任务ID?

有人可以解释这样做的目的/好处吗?

谢谢!

【问题讨论】:

  • 这是一个 ViewModel,其作用域是刚刚创建的 Fragment,它发生在 onCreate() 中,不是吗?如果不通过argumentstaskId 传递给Fragment,就无法将taskId 转换为onCreate

标签: android android-fragments mvvm dependencies


【解决方案1】:

Android 需要能够在任何时候从头开始重新构建您的片段。它只知道两件事:

  1. 您的片段具有默认构造函数
  2. 您的片段可以传递参数包

它不知道如何调用任意构造函数以及传递给该构造函数的参数。它也不知道如何坚持和恢复这些论点。

这个想法是您将任何初始化信息放入参数包中。当您的活动 + 片段被销毁(因为内存压力)时,Android 会保存参数 Bundle。如果稍后重新创建您的活动 + 片段,则会提供相同的参数。 Bundle 的特殊之处在于它实现了 Parcelable,这意味着 Android 知道如何将其转换为纯字节并再次返回。

【讨论】:

    猜你喜欢
    • 2016-03-20
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多