1

我正在尝试遵循 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 会更好吗?

为了做到这一点,我是否必须将 ViewModel 限定为 Activity,如本博客中所述?

这里的最佳做法是什么?

4

1 回答 1

1

Android 文档建议为“主-细节片段的常见案例”共享一个 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

于 2019-01-01T04:47:23.767 回答