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.


-
Рекламные сети1 месяц назад
Кейс SB-Games: как увеличить APRU 18 приложений на 40%
-
Аналитика магазинов1 месяц назад
Глобальный охват китайских приложений: исследование прибыльных рынков и вертикалей
-
Интегрированные среды разработки1 месяц назад
Анализ производительности для ускорения сборок в Xcode
-
GitHub1 месяц назад
JsonTree: красивый Json в Compose