我应该在两个片段之间共享ViewModel吗?

时间:2018-12-31 21:43:55

标签: android-fragments android-architecture-components android-livedata android-mvvm android-architecture-lifecycle

我正在尝试遵循Android最佳做法,并使用推荐的最新架构组件。您到目前为止可以在这里看到我的尝试:https://github.com/randroid88/TodayILearned

目前,该应用程序的功能非常有限。

  • 它具有一个Room db,用于本地存储日记帐分录。
  • 一个片段HomeFragment,其中列出了所有条目
  • 另一个片段EntryEditorFragment,用于创建新条目。
  • 一个ViewModel, EntryViewModel,可通过存储库更新数据。

问题在于,只有HomeFragment现在可以访问EntryViewModel。

因此,在当前设计中,我通过参数捆绑包(使用新导航架构组件中的SafeArgs)将新条目文本从EntryEditorFragment传递到HomeFragment,然后HomeFragment通过EntryViewModel创建新条目:

val safeArgs = HomeFragmentArgs.fromBundle(arguments!!)
    savePossibleNewEntry(safeArgs.entryText)

private fun savePossibleNewEntry(entryText: String) {
    entryViewModel!!.insert(EntryCreator().create(entryText))
}

感觉不对。

EntryViewModel也可以访问EntryEditorFragment会更好吗?

为了实现这一点,我是否必须按照此处on this blog的说明将ViewModel的范围限定在Activity上?

这里的最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

Android documentation建议为“常见的主细节片段案例”共享一个ViewModel,因此我决定对我的案例也这样做。

如建议的那样,我将ViewModel的作用域划分为两个片段中的Activity:

entryViewModel = activity?.run {
        ViewModelProviders.of(this, EntryViewModelFactory(this.application, EntryRepository(this.application))).get(EntryViewModel::class.java)
    } ?: throw Exception("Invalid Activity")

这是我进行更改的提交: https://github.com/randroid88/TodayILearned/commit/e307bd3f238e68a399a2a1619438770d908a606d