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

问题描述 投票:0回答:1

我有一个包含许多片段的活动。每个片段都有一个viewModel,它的作用范围是它的生命周期,里面有一些逻辑。主活动也有一个viewModel,包括一些显示弹出式消息的代码。

我希望我的片段viewModel能够向这个弹出式消息发布消息。然而,我如何能从我的一个fragment-viewModel内部访问activity-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
    }
}

我不能轻松地调用 ViewModelProvider 因为我不想在我的viewModel中保留一个对Activity的引用。我看到的唯一直接的选择是通过构造函数或一个 init() 方法。该 是安全的,因为父视图模型的寿命应该超过片段视图模型的寿命。我想是这样的。

不过,这个解决方案还是让我觉得不妥。

有其他的选择吗?或者是完全不同的方法来解决这个问题?

java android kotlin android-viewmodel
1个回答
0
投票

这是一个菜鸟的想法。

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

如果你

  1. 在你的片段中创建一个接口,其中包含 "fragmentAWantsToUsePostMessage "的方法。
  2. 在activity中实现接口,这样每次fragmentAWantsToUsePostMessage被调用时,activity都会调用postMessage。
  3. 在你的片段中获取对接口实现的引用。
  4. 当片段需要调用 "post message "时,使用该引用。

这应该不行吗?还是说这违反了你的 "不留参考资料"?"正如我所说。我是新来的,所以我可能完全错了 I'm new to all of this, so I might be completely wrong.

我可以看到媒介上有一个帖子可能是相关的。"如何在片段和活动之间进行交流

© www.soinside.com 2019 - 2024. All rights reserved.