一个稳定的,多平台的 分子颗粒Molecule 1.0

138 阅读1分钟

搬运自 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 系列的一部分。