如何处理不同viewModel之间的通信?

s3r*_*ius 6 java android kotlin android-viewmodel

我有一个包含许多片段的活动。每个片段都有一个其生命周期范围内的视图模型,其中包含一些逻辑。宿主活动也有一个 viewModel,包括一些显示弹出式消息的代码。

我希望我的片段视图模型能够向此弹出窗口发布消息。但是,我如何从我的片段视图模型之一访问活动视图模型?

我将编写一些示例性的 Kotlin 代码,但问题并不是 Kotlin 特有的,因为它更多的是一个架构问题。

class MyActivityViewModel {
    ...
    popupMessage = MutableLiveData<String>("") // is observed by my activity
    fun postMessage(text: String) {
        popupMessage.value = text
    }
}

class MyFragmentAViewModel {
    ...
    fun someFunctionA() {
        // want to call ActivityViewModel's postMessage from here
    }
}
class MyFragmentBViewModel {
    ...
    fun someFunctionB() {
        // want to call ActivityViewModel's postMessage from here too
    }
}

Run Code Online (Sandbox Code Playgroud)

我无法轻松调用,ViewModelProvider因为我不想在视图模型中保留对 Activity 的引用。我看到的唯一直接选项是通过构造函数或方法将 Activity-viewModel 传递给fragment-viewModel init()。这应该是安全的,因为父 viewModel 的生命周期应该超过片段 viewModel 的生命周期。我认为。

尽管如此,这个解决方案还是让我很恼火。

还有其他选择吗?或者也许对这个问题采取完全不同的方法?

小智 0

这是新手的想法:

你不能告诉 Activity 你的片段想要使用它的方法吗?

如果你

  1. 在片段中使用“fragmentAWantsToUsePostMessage”方法创建一个接口
  2. 在activity中实现该接口,这样每次调用fragmentAWantsToUsePostMessage时,activity都会调用postMessage
  3. 获取片段中接口实现的引用
  4. 当片段需要调用“发布消息”时使用该引用

这不应该起作用吗?或者这违背了你的“不保留参考资料”?正如我所说:我对这一切都是新手,所以我可能完全错了。

我可以看到媒体上有一篇可能相关的帖子:How to Communicate Between Fragment and Activity