Connect with us

GitHub

Molecule: создание потоков StateFlow в помощью Jetpack Compose

Фото аватара

Опубликовано

/

     
     

Molecule — библиотека для построения потоков StateFlow или Flow для Jetpack Compose.

Jetpack Compose UI позволяет легко создавать декларативные пользовательские интерфейсы с логикой.

К сожалению, при этом смешивается бизнес-логика с логикой отображения, что делает тестирование более сложным, чем если бы они были разделены. Кроме того, уровень отображения напрямую взаимодействует с уровнем хранения данных, что создает нежелательное сопряжение. Кроме того, если мы захотим подключить другой дисплей с той же логикой (возможно, на другой платформе), мы не сможем этого сделать.

Вынесение бизнес-логики в объект, подобный презентеру, устраняет эти три проблемы.

В Cash App объекты-презентеры традиционно представляют один поток моделей отображения через корутины Kotlin Flow или RxJava Observable.

sealed interface ProfileModel {
  object Loading : ProfileModel
  data class Data(
    val name: String,
    val balance: Long,
  ) : ProfileModel
}

class ProfilePresenter(
  private val db: Db,
) {
  fun transform(): Flow<ProfileModel> {
    return combine(
      db.users().onStart { emit(null) },
      db.balances().onStart { emit(0L) },
    ) { user, balance ->
      if (user == null) {
        Loading
      } else {
        Data(user.name, balance)
      }
    }
  }
}

Этот хорошо, но церемония объединения реактивных потоков будет масштабироваться нелинейно. Это означает, что чем больше источников данных используется и чем сложнее логика, тем сложнее понять реактивный код.

Несмотря на то что состояние Loading выдается синхронно, Compose UI требует указания начального значения для всех потоков или Observable. Это нарушение слоев, поскольку слой представления не в состоянии задать разумное значение по умолчанию, так как слой презентера управляет объектом модели.

Molecule позволяет решить обе эти проблемы. Презентер может возвращать StateFlow<ProfileModel>, начальное состояние которого может быть синхронно прочитано на уровне представления с помощью Compose UI. Кроме того, используя Compose, можно строить объекты модели с помощью императивного кода, построенного на возможностях языка Kotlin, а не реактивного кода, состоящего из API библиотеки RxJava.

Molecule на GitHub: https://github.com/cashapp/molecule/
Платформа: Android
⭐️: 1.5K
Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Advertisement

Наши партнеры:

LEGALBET

Мобильные приложения для ставок на спорт
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: