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.
-
Интегрированные среды разработки2 недели назад
Лучшая работа с Android Studio: 5 советов
-
Новости4 недели назад
Видео и подкасты о мобильной разработке 2024.43
-
Новости3 недели назад
Видео и подкасты о мобильной разработке 2024.44
-
Исследования2 недели назад
Поможет ли новая архитектура React Native отобрать лидерство у Flutter в кроссплатформенной разработке?