搬运自 A stable, multiplatform Molecule 1.0 | Cash App Code Blog,欢迎指正汉化错误
Molecule是一个基于Compose的库,我们两年前宣布用于管理应用程序状态。我很高兴地宣布,今天我们将发布 1.0 版,这是它的第一个稳定版本!
自原始帖子以来,Molecule获得了两个主要功能:
1. 除了 Android 之外,还支持 Kotlin 多平台目标(JVM、JS 和本机)。
2. 即时重构模式,无需提供帧时钟。
这些有什么用?让我们看一个例子!
纯 Compose UI 应用可以将状态生成可组合项与 UI 呈现可组合项分开。
@Composable fun counter(start: Int = 0): Int {
var count by remember { mutableStateOf(start) }
LaunchedEffect(Unit) {
while (true) {
delay(1.seconds)
count++
}
}
return count
}
@Composable fun CounterText(value: Int) {
Text("$value", fontSize = 20.sp)
}
现在,CounterText() 可以很容易地与@Preview 和/或 Paparazzi (cashapp.github.io) 快照测试一起使用。状态count()可以与Molecule的功能一起使用时更加强大。
提高重用率
将基于 View 的大型 Android 应用迁移到撰写 UI 需要很长时间。在 UI 重写期间,无需将状态逻辑保留在 RxJava 等库中,而是可以尽早迁移到 Compose 中,并作为 StateFlow 向视图公开。
fun CoroutineScope.launchCounter(start: Int = 0): StateFlow<Int> {
return launchMolecule(mode = ContextClock) {
counter(start)
}
}
由于 Compose 在 Compose UI 的上下文之外运行并生成纯数据,因此通知、小组件等其他目标可能会成为输出的目标。
分离时钟
当更像演示者使用时,以 UI 框架的速度重构 counter() 并不总是有意义的。每当有新的变化产生时,分子的“即时”重组模式就会触发。
fun countFlow(start: Int = 0): Flow<Int> {
return moleculeFlow(mode = Immediate) {
counter(start)
}
}
此Flow 流 每秒将生成一个新值,因为此时内部计时器会更新内部计数并通知 Compose 挂起的状态更改。
简化测试
作为 Flow 公开的 counter() 逻辑现在可以使用 Turbine 进行单元测试。
@Test fun counts() = runTest {
countFlow().test {
assertEquals(0, awaitItem())
assertEquals(1, awaitItem())
assertEquals(2, awaitItem())
}
}
@Test fun countStart() = runTest {
countFlow(start = 3).test {
assertEquals(3, awaitItem())
assertEquals(4, awaitItem())
}
}
这些单元测试将在 JVM 上运行,因为...
多平台使用
Molecule 在 JetBrains Compose 运行时支持的每个 Kotlin 多平台目标上运行。因此,除了在 JVM 上启用单元测试之外,您的 counter() 现在可以在针对 SwiftUI 的 iOS 平台或针对 DOM 的 Web 上运行。
suspend fun main() {
val count = document.getElementById("count")
countFlow().collect { value ->
count.innerText = "$value"
}
}
------------------------------------------------------------------------------------------------
无论是 100% Compose UI Android 应用程序、具有许多目标的 Kotlin 多平台项目,还是介于两者之间的东西,Molecule 都可以帮助您使用 Compose 管理状态。
这篇文章是 Cash App’s Summer of Kotlin Multiplatform | Cash App Code Blog 系列的一部分。