Внедрите Redux с помощью Android Observer / Livedata / Coroutine / Kotlin - PullRequest
2 голосов
/ 11 апреля 2020

Рассмотрим архитектуру приложения Android, рекомендованную Google: https://developer.android.com/jetpack/docs/guide
Эта архитектура основана на ViewModel и Observables, поэтому я бы отнес ее к категории "Model-View-ViewModel" (MVVM) архитектура.

Это очень отличается от React-Redux. В то время как архитектура Android поддерживает двунаправленные потоки данных между Views и ViewModels, Redux обеспечивает однонаправленный поток данных в круге. Более того, архитектура Android поддерживает состояние в нескольких моделях ViewModels, тогда как Redux обеспечивает централизованное хранилище.

Теперь мой вопрос состоит в том, как реализовать Redux с собственными библиотеками Android. Моя первая попытка будет:

  • Реализация централизованного хранилища как Kotlin Singleton-объекта.
  • Хранилище предоставляет sendAction -метод, который выполняет действие, помещает его в очередь, а затем быстро возвращается.
  • Действия являются чистыми Kotlin классами данных, поскольку они не должны содержать лог c.
  • В хранилище реализовать Kotlin -Программу, которая выбирает действия из очереди и отправляет их с помощью огромного оператора switch.
  • Используйте базу данных Room + некоторое эфемерное состояние в качестве модели. В частности, эфемерное состояние контролирует, какой фрагмент / диалог отображается в любой момент времени.
  • Убедитесь, что состояние изменяется только сопрограммой.
  • Используйте наблюдаемые жизненные данные (androidx.lifecycle.LiveData) для повторного рендеринга пользовательского интерфейса при изменении базы данных комнаты или эфемерного состояния.
  • Поскольку наблюдаемых недостаточно для управления пользовательским интерфейсом Android, мне также понадобится функция, которая сравнивает текущий фрагмент / активность с ожидаемым состоянием и, например, запускает транзакцию FragmentManager, если обнаружено отклонение.

Однако некоторые моменты не ясны:

  • Как сохранить активность / фрагменты в синхронизации c с глобальным состоянием? Возможно, я бы использовал одно действие и заменил фрагменты по мере необходимости, в зависимости от текущего состояния магазина.

  • Как я могу реализовать обе асинхронные c + диспетчеризацию последовательных действий? Возможно, я бы реализовал единственную подпрограмму Kotlin, которая собирает входящие действия из очереди и отправляет их прямо в поток пользовательского интерфейса.

  • Как мы можем гарантировать, что весь пользовательский интерфейс перезаписывается перед отправкой новых действий? Возможно, я остановлю диспетчеризирующую сопрограмму, пока в очереди потока пользовательского интерфейса больше не будет других исполняемых объектов?

1 Ответ

1 голос
/ 11 апреля 2020

Вы правы, когда говорите, что с MVVM есть некоторые ограничения.

Архитектура в стиле Redux обычно называется 'MVI' или 'Unidirectional' в Android.

В Android уже предпринимаются некоторые попытки внедрения этой архитектуры, на которые вы можете взглянуть, чтобы помочь ответить на ваши вопросы:

MvRx

Мосби

Кроме того, на этой сводной странице имеется список статей / библиотек, описывающих подход.

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