У меня есть активность, которая содержит несколько фрагментов. Каждый фрагмент имеет viewModel, ограниченную временем жизни, с некоторым количеством логики c внутри. У хост-активности также есть viewModel, включая некоторый код для отображения сообщения в стиле всплывающего окна.
Я хочу, чтобы мой фрагмент viewModels мог публиковать сообщения в этом всплывающем окне. Тем не менее, как я могу получить доступ к Activity-viewModel изнутри одной из моих фрагментов-viewModels?
Я напишу примерный Kotlin код, но вопрос не указывается c к 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
, так как я бы не хотел хранить ссылку на Activity в моей viewModel. Единственный прямой вариант, который я вижу, - это передать активность-представление-модель фрагменту-представление-модели через конструктор или метод init()
. Что должно быть безопасным, поскольку время жизни родительского viewModel должно превышать время жизни фрагмента viewModels. Я думаю.
Тем не менее, это решение меня теряет.
Есть ли другие альтернативы? Или, может быть, совершенно другой подход к проблеме?