当前位置: 首页 > news >正文

Molecule:使用Jetpack Compose构建StateFlow流

Molecule:使用Jetpack Compose构建StateFlow流

Kotlin Flow

看下面的jetpack compose片段:

@Composable
fun MessageCard(message: Message) {Column {Text(text = message.author)Text(text = message.body)}
}

这段代码最有趣的部分是它实际上是reactive。其反应性为 通过@Composable注释和委托变量抽象出来。例如,假设参数被委托给 MutableState。当Message数据变化时,会驱动Text更新。
Message是下列响应式类型之一:Message Observable<Message> Flow<Message> MessageCard() Observable<View> Flow<View>
最重要的是提供了composable类型的Kotlin Flow API,例如 StateFlow<T>.collectAsState: State<T>
代码示例如下:

@Composable
fun profilePresenter(userFlow: Flow<User>,balanceFlow: Flow<Long>,
): 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 <T> moleculeFlow(clock: RecompositionClock,body: @Composable () -> T,
): Flow<T>/**
* Launch a coroutine into this [CoroutineScope] which will continually recompose `body`
* to produce a [StateFlow] stream of [T] values.
*/
fun <T> CoroutineScope.launchMolecule(clock: RecompositionClock,body: @Composable () -> T,
): StateFlow<T>

Molecule允许您为两种不同的重组行为传递两个时钟:

  • ContextClock将委托给MonotonicFrameClock CoroutineContext的调用方。
  • Immediate 将使生成的流在每次快照状态为失效。
    在不失去reactive的情况下编写命令式代码是极佳的选择。详细信息请查看Molecule的README文档。
    https://github.com/cashapp/molecule/blob/trunk/README.md
http://www.lryc.cn/news/25823.html

相关文章:

  • 计算机组成原理(2.2)--系统总线
  • 如何使用dlinject将一个代码库实时注入到Linux进程中
  • Docker安装Cassandra数据库,在SpringBoot中连接Cassandra
  • Linux常用命令总结(建议收藏)
  • 【Java】P1 基础知识与碎碎念
  • Jackson CVE-2017-7525 反序列化漏洞
  • 【2023】DevOps、SRE、运维开发面试宝典之Kubernetes相关面试题
  • 【算法】PatchMatch立体匹配算法_原理解析
  • 【同步工具类:CyclicBarrier】
  • Android 12.0 Settings 去掉打开开发者模式和USB调试模式的广播
  • OSI七层网络模型和TCP/IP四层网络模型的异同
  • 接口测试必备技能 - 加密和签名
  • JVM虚拟机概述(1)
  • 学习.NET MAUI Blazor(七)、实现一个真正的ChatGPT聊天应用
  • Django框架学习
  • JavaSE21-集合1-set
  • Web版和客户端哪种SQL工具更好?ChatGPT有话要说
  • 从客户端的角度来看移动端IM即时通讯的消息可靠性和送达机制
  • 2023年java春招面试题及答案
  • Django学习——基础篇(上)
  • 研报精选230302
  • Unity心得
  • TryHackMe-Binex
  • 外贸人如何写出优秀的开发信?附详细思路
  • python自学之《21天学通Python》(18)——第21章 案例2 Python搞定大数据
  • 面试问题【数据库】
  • Allegro如何输出钻孔表操作指导
  • 消息队列 面试题 整理
  • 【Java】对象比较大小
  • 发票自动OCR识别并录入模板 3分钟免费配置