Как обрабатывать связь между разными viewModels? - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть активность, которая содержит несколько фрагментов. Каждый фрагмент имеет 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. Я думаю.

Тем не менее, это решение меня теряет.

Есть ли другие альтернативы? Или, может быть, совершенно другой подход к проблеме?

1 Ответ

0 голосов
/ 23 апреля 2020

Вот мысль о зеленом роге:

Разве вы не можете сказать деятельности, что ваш фрагмент хочет использовать ее метод?

Если вы

  1. Make интерфейс с методом а-ля «fragAWantsToUsePostMessage» в вашем фрагменте
  2. Реализуйте интерфейс в действии, чтобы каждый раз, когда вызывался фрагментAWantsToUsePostMessage, действие вызывало postMessage
  3. Получите ссылку на реализацию интерфейса в вашем фрагменте
  4. Используйте эту ссылку, когда фрагмент должен вызвать "сообщение"

Разве это не должно работать? Или это против твоего "не ведения ссылки"? Как я уже сказал: я новичок во всем этом, поэтому я могу быть совершенно не прав.

Я вижу, что есть сообщение на носителе, которое может иметь отношение: Как общаться между фрагментом и деятельностью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...