【问题标题】:Android nested ViewModel with navigation controller带有导航控制器的 Android 嵌套 ViewModel
【发布时间】:2019-08-02 12:50:50
【问题描述】:

我有一个包含片段的活动 (ParentFragment)。

ParentFragment 有一个片段,其导航控制器带有多个片段。

ParentFragment 的 ViewModel 具有标题、副标题和颜色属性。

每次我导航到另一个片段时,ParentFragment 的 ViewModel 数据都应该更新(片段是带有数据的片段),我该如何实现?

我知道如何共享一个viewModel,它不适合项目需要,每个片段都应该有自己的viewModel,ParentFragment也是如此。

class ParentFragment: Fragment() {
    private lateinit var parentViewModel: ParentViewModel
}

class ChildFragment: Fragment() {
    private lateinit var childViewModel: ChildViewModel
}

class ParentViewModel : ViewModel() {
     var title: String? = null
     var subtitle: String? = null
     var color: Int? = null
}

class ChildViewModel : ViewModel() {
    init {
        // I need to access ParentViewModel and update title, subtitle and color here.
    }
}

【问题讨论】:

  • @a_local_nobody 来源?
  • 这并不意味着一个片段不能包含另一个片段
  • @a_local_nobody "两个片段永远不应该直接通信。"与“一个片段不应包含另一个片段”不同,后者是错误的。无论如何,假设您有一个为所有片段共享自定义标题的活动,并且每个片段都具有标题文本的值,该标题的文本将成为活动 ViewModel 的一部分,如果您不想要一个巨大的 ViewModel,您将拥有每个片段一个 ViewModel,片段和活动之间不共享一个。片段不应该知道活动的 ViewModel,这就是为什么嵌套 ViewModel 是一种解决方案,我只是不知道如何。
  • 你是说,你有一个活动,有一个片段,所有其他片段都需要知道那个片段的价值?
  • @a_local_nobody 我根本不是这么说的,在假设的情况下,我告诉过你片段更新了活动标题,彼此不知道,他们也不知道活动,但它们具有活动标题的文本(例如,当您在活动中有一个工具栏但片段是具有标题所需信息的片段时)。

标签: android mvvm nested navigation viewmodel


【解决方案1】:

你需要在ChildViewModel中实现ParentViewModel

class ChildViewModel : ParentViewModel() {
    init {
        title = "Title"
        subtitle = "Sub Title"
        color = -123454
        // I need to access ParentViewModel and update title, subtitle and color here.
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 2017-05-14
    • 2019-07-28
    • 2015-07-28
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    相关资源
    最近更新 更多