我应该在两个片段之间共享我的 ViewModel 吗?
Should I share my ViewModel across two fragments?
-
android-fragments
-
android-mvvm
-
android-livedata
-
android-architecture-lifecycle
-
android-architecture-components
我正在尝试遵循 Android 最佳实践并使用最新推荐的架构组件。你可以在这里看到我到目前为止的尝试:https://github.com/randroid88/TodayILearned
目前应用程序的功能非常有限。
- 它有一个用于本地存储日记条目的 Room 数据库。
- 一个片段,HomeFragment,列出了所有条目
- 创建新条目的另一个片段 EntryEditorFragment。
- 一个视图模型,
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?
这里的最佳做法是什么?
Android documentation 建议为 "a common case of master-detail fragments" 共享一个 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
android-fragments
android-mvvm
android-livedata
android-architecture-lifecycle
android-architecture-components
我正在尝试遵循 Android 最佳实践并使用最新推荐的架构组件。你可以在这里看到我到目前为止的尝试:https://github.com/randroid88/TodayILearned
目前应用程序的功能非常有限。
- 它有一个用于本地存储日记条目的 Room 数据库。
- 一个片段,HomeFragment,列出了所有条目
- 创建新条目的另一个片段 EntryEditorFragment。
- 一个视图模型, 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?
这里的最佳做法是什么?
Android documentation 建议为 "a common case of master-detail fragments" 共享一个 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