【发布时间】: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