看下面的jetpack compose片段:
@Composable
fun MessageCard(message: Message) {Column {Text(text = message.author)Text(text = message.body)}
}
这段代码最有趣的部分是它实际上是reactive。其反应性为 通过@Composable
注释和委托变量抽象出来。例如,假设参数被委托给 MutableState
。当Message
数据变化时,会驱动Text
更新。
Message
是下列响应式类型之一:Message
Observable
Flow
MessageCard()
Observable
Flow
最重要的是提供了composable类型的Kotlin Flow API,例如 StateFlow
代码示例如下:
@Composable
fun profilePresenter(userFlow: Flow,balanceFlow: Flow,
): ProfileModel {val user by userFlow.collectAsState(null)val balance by balanceFlow.collectAsState(0L)return if (user == null) {Loading} else {Data(user.name, balance)}
}
不像RxJava
和Kotlin Flow 提供复杂的操作符,而简单使用if/else when for
等逻辑判断就可以提供响应式代码。
现在的问题是:我将如何在non-composable
环境中使用我的composable
方法?
答案是 Molecule
https://github.com/cashapp/molecule/
Molecule
做了一件事情,将一个composable
方法转为FlowState
或者 Flow
API之一。
/**
* Create a [Flow] which will continually recompose `body` to produce a stream of [T] values
* when collected.
*/
fun moleculeFlow(clock: RecompositionClock,body: @Composable () -> T,
): Flow/**
* Launch a coroutine into this [CoroutineScope] which will continually recompose `body`
* to produce a [StateFlow] stream of [T] values.
*/
fun CoroutineScope.launchMolecule(clock: RecompositionClock,body: @Composable () -> T,
): StateFlow
Molecule
允许您为两种不同的重组行为传递两个时钟:
ContextClock
将委托给MonotonicFrameClock
CoroutineContext
的调用方。Immediate
将使生成的流在每次快照状态为失效。