【问题标题】:How to handle communication between different viewModels?如何处理不同视图模型之间的通信?
【发布时间】:2020-04-23 11:15:43
【问题描述】:

我有一个包含许多片段的活动。每个片段都有一个视图模型,其范围仅限于其生命周期,其中包含一些逻辑。宿主活动也有一个 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() 方法将活动视图模型传递给片段视图模型。 应该是安全的,因为父视图模型的生命周期应该超过片段视图模型的生命周期。我想。

不过,这个解决方案让我很不爽。

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

【问题讨论】:

  • 考虑使用自定义数据总线进行组件内通信:“观察者”或某种“生产者-消费者”在应用程序级别启动和处理。每个 ViewModel 都可以在“init”中订阅总线,在“onCleared”中取消订阅。数据是由任何人发送给任何人的,你只需要找到一种方法来过滤掉数据(通过一些标志,或类型,或其他......)

标签: java android kotlin android-viewmodel


【解决方案1】:

这是新手的想法:

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

如果你

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

这不应该吗?还是这与您的“不保留参考”相反? 正如我所说:我对这一切都很陌生,所以我可能完全错了。

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

【讨论】:

  • 感谢您的评论。我可以使用回调,但这似乎相当麻烦。基本上它会是这样的:FragmentViewModel decides it wants to post a message -&gt; FragmentViewModel puts it in a liveData object -&gt; Fragment receives this data and notifies the activity via callback -&gt; Activity notifies its viewModel -&gt; viewModel does its thing and puts the result in another liveData -&gt; Finally, activity receives this lifeData and displays the message。仅仅为了从一个班级获取一条信息到另一个班级,就需要执行很多步骤。
猜你喜欢
  • 1970-01-01
  • 2012-06-28
  • 2015-02-11
  • 2010-09-18
  • 2011-09-06
  • 1970-01-01
  • 2020-01-09
  • 2014-07-10
  • 1970-01-01
相关资源
最近更新 更多