Molecule:使用Jetpack Compose构建StateFlow流
Molecule:使用Jetpack Compose构建StateFlow流

看下面的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将委托给MonotonicFrameClockCoroutineContext的调用方。Immediate将使生成的流在每次快照状态为失效。
在不失去reactive的情况下编写命令式代码是极佳的选择。详细信息请查看Molecule的README文档。
https://github.com/cashapp/molecule/blob/trunk/README.md
相关文章:
Molecule:使用Jetpack Compose构建StateFlow流
Molecule:使用Jetpack Compose构建StateFlow流 看下面的jetpack compose片段: Composable fun MessageCard(message: Message) {Column {Text(text message.author)Text(text message.body)} }这段代码最有趣的部分是它实际上是reactive。其反应性为 通过Composa…...
计算机组成原理(2.2)--系统总线
目录 一、总线结构 1.单总线结构 1.1单总线结构框图 编辑1.2单总线性能下降的原因 2.多总线结构 2.1双总线结构 2.2三总线结构 2.3四总线结构 编辑 二、总线结构举例 1. 传统微型机总线结构 2. VL-BUS局部总线结构 3. PCI 总线结构 4. 多层 PCI 总线结构 …...
如何使用dlinject将一个代码库实时注入到Linux进程中
关于dlinject dlinject是一款针对Linux进程安全的注入测试工具,在该工具的帮助下,广大研究人员可以在不使用ptrace的情况下,轻松向正在运行的Linux进程中注入一个共享代码库(比如说任意代码)。之所以开发该工具&#…...
Docker安装Cassandra数据库,在SpringBoot中连接Cassandra
简介 Apache Cassandra是一个高度可扩展的高性能分布式数据库,旨在处理许多商用服务器上的大量数据,提供高可用性而没有单点故障。它是NoSQL数据库的一种。首先让我们了解一下NoSQL数据库的作用。 NoSQL 数据库 NoSQL数据库(有时称为“Not …...
Linux常用命令总结(建议收藏)
Linux常用命令总结(建议收藏) 这里收集了一些常用命令以便需要时查看,欢迎作补充。(这里的提到操作都默认以CentOS系统为基础) 文件管理 目录操作 切换目录 cd 查看目录 ls -l 列出文件详细信息 或者直接ll-a 列出当前目录下所有文件及…...
【Java】P1 基础知识与碎碎念
Java 基础知识 碎碎念安装 Intellij IDEAJDK 与 JREJava 运行过程Java 系统配置Java 运行过程Java的三大分类前言 本节内容主要围绕Java基础内容,从Java的安装到helloworld,什么是JDK与什么是JRE,系统环境配置,不深入Java代码知识…...
Jackson CVE-2017-7525 反序列化漏洞
0x00 前言 Jackson 相对应fastjson来说利用方面要求更加苛刻,默认情况下无法进行利用。 同样本次的调用链也可以参考fastjson内容:Java代码审计——Fastjson TemplatesImpl调用链 相关原理,可以参考:Jackson 反序列化漏洞原理 …...
【2023】DevOps、SRE、运维开发面试宝典之Kubernetes相关面试题
文章目录 1、Kubernetes集群的特点?2、Kubernetes集群各节点的组件有那些?分别有什么作用?3、简述Kubernetes集群的工作原理4、什么是Pod资源5、Label标签的作用?6、Deployment控制器与Statfulset控制器的区别?7、Pod拉取镜像的三种策略?8、简述Pod的生命周期9、Pod的生命…...
【算法】PatchMatch立体匹配算法_原理解析
目录 前言 原理解析 1.倾斜支持窗口(Slanted Support Windows) 什么是视差平面? 为什么视差和像素坐标点之间的关系可以解释为平面方程? 视差平面的通用参数方程和点加法向量方程 什么是倾斜支持窗口? 2.基于倾…...
【同步工具类:CyclicBarrier】
同步工具类:CyclicBarrier介绍源码分析CyclicBarrier 基于ReetrantLock Condition实现。构造函数await() 函数业务场景方案一:代码实现测试截图方案二代码实现测试打印总结介绍 官方介绍: 一种同步辅助工具,允许一组线程都等待对方到达共同的障碍点。CyclicBarrie…...
Android 12.0 Settings 去掉打开开发者模式和USB调试模式的广播
1.概述 在12.0的系统产品rom定制化开发中,在系统Settings的开发者模式中,打开开发者模式和usb调试模式都会发出开发者模式改变广播和usb调试模式改变广播, 项目开发功能需要要求去掉这两个广播以免影响其他功能,所以就要看哪里发出广播来屏蔽掉就可以了,这样就可以去掉开发…...
OSI七层网络模型和TCP/IP四层网络模型的异同
文章目录前言一、什么是OSI?二、什么是TCP/IP四层模型?三、OSI七层网络模型和TCP/IP四层网络模型的关系:四、 OSI七层和TCP/IP的区别:前言 本节系统总结: 一、什么是OSI?二、什么是TCP/IP四层模型…...
接口测试必备技能 - 加密和签名
1、什么是加密以及解密? 加密:在网络上传输的原始数据(明文)经过加密后形成(密文)传输,防止被窃取。 解密:将加密还原成原始数据 2、加密方式分类? 对称式加密…...
JVM虚拟机概述(1)
1.JVM概述 1.1为什么要学习JVM 通过学习JVM ( java Virtual Machine )可以帮助我们理解java程序运行的过程,了解虚拟机中各种机制的实现原理。为后期写出优质的代码做好准备,为向更高的层次提升打好基础。 1.2虚拟机 虚拟机的本质就是在windows中&…...
学习.NET MAUI Blazor(七)、实现一个真正的ChatGPT聊天应用
今天在新闻上看到一条消息,OpenAI已经开放了ChatGPT的接口,也就是GPT-3.5,对比原来的GPT-3,增加了gpt-3.5-turbo、gpt-3.5-turbo-0301两个模型。 gpt-3.5-turbo:使用最新的GPT-3.5模型,并针对聊天进行了优…...
Django框架学习
文章目录Django框架项目开发1. 创建项目2. 项目目录结构3. 视图函数(view)4. 路由配置url5. HTTP请求6. HTTP响应 - 状态吗7. GET方式传参8. POST传递参数模板Templates1. 通过 loader 获取模板,通过HttpResponse进行响应2. 使用 render() 直接加载并响应…...
JavaSE21-集合1-set
文章目录一、集合概念二、set集合1、set集合的特点2、HashSet2.1 特点2.2 创建对象2.3 常用方法2.4 遍历2.4.1 foreach遍历2.4.2 使用迭代器遍历2.4.3 转换为数组遍历一、集合概念 集合就是用于存储多个数据的容器。相对于具有相同功能的数组来说,集合的长度可变会…...
Web版和客户端哪种SQL工具更好?ChatGPT有话要说
2023年年初公司发布了一款Web版SQL工具,短期内就赢得了众多用户的喜爱和下载。不过,也有SQL用户在评论区中提出自己的观点,认为Web版工具都不可靠,甚至看见Web版工具就劝返… … 工具Web化逐渐成为一种趋势,比如&…...
从客户端的角度来看移动端IM即时通讯的消息可靠性和送达机制
如何确保IM 不丢消息是个相对复杂的话题,从客户端发送数据到服务器,再从服务器抵达目标客户端,最终在 UI 成功展示,其间涉及的环节很多,这里只取其中一环「接收端如何确保消息不丢失」来探讨,粗略聊下我接触…...
2023年java春招面试题及答案
2023年java春招面试题1、下面有关jdbc statement的说法错误的是?2、下面有关JVM内存,说法错误的是?3、下面有关servlet service描述错误的是?4、下面有关servlet和cgi的描述,说法错误的是?5、下面有关SPRIN…...
嵌入式开发中的静态代码分析工具与应用
嵌入式代码静态分析工具深度解析1. 静态代码分析技术概述1.1 传统编译器的局限性标准C语言编译器通常只能检测代码中的语法错误和部分潜在缺陷,对于程序架构设计和逻辑层面的问题往往无能为力。这种局限性在嵌入式开发中尤为明显,因为嵌入式系统对代码质…...
如何将TaskWeaver与LangChain无缝集成:扩展AI代理能力边界的终极指南
如何将TaskWeaver与LangChain无缝集成:扩展AI代理能力边界的终极指南 【免费下载链接】TaskWeaver A code-first agent framework for seamlessly planning and executing data analytics tasks. 项目地址: https://gitcode.com/gh_mirrors/ta/TaskWeaver T…...
突破性AI音乐创作革新:腾讯SongGeneration开源项目全解析
突破性AI音乐创作革新:腾讯SongGeneration开源项目全解析 【免费下载链接】SongGeneration 腾讯开源SongGeneration项目,基于LeVo架构实现高品质AI歌曲生成。它采用混合音轨与双轨并行建模技术,既能融合人声与伴奏达到和谐统一,也…...
告别风扇噪音与过热:FanControl智能控温完全指南
告别风扇噪音与过热:FanControl智能控温完全指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanC…...
神经高利贷:预支未来技能导致认知崩溃
在软件测试领域,从业者常面临一个隐形威胁:过度追求新技能而忽视认知极限,最终引发崩溃。这种现象被称为“神经高利贷”,即通过预支未来学习能力来应对当前挑战,结果导致认知资源枯竭、错误率飙升,甚至职业…...
大三大学生挖洞收入十万背后:网安圈的“天才少年”,普通人能复制吗?
大三学生挖洞收入十万背后:网安圈的 “天才少年” ,普通人能复制吗? SRC首期学员战绩疯传:大四小白45天回本6K?大三在读2个月挖洞收获六位数? 当朋友圈被"零基础挖洞暴富"的捷报疯狂刷屏时&…...
5分钟掌握Axure RP多版本语言包管理:从部署到定制全流程
5分钟掌握Axure RP多版本语言包管理:从部署到定制全流程 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包,不定期更新。支持 Axure 9、Axure 10。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn …...
BoneAnimCopy: 跨模型骨骼动画复用解决方案,提升10倍效率的动画师实践指南
BoneAnimCopy: 跨模型骨骼动画复用解决方案,提升10倍效率的动画师实践指南 【免费下载链接】blender_BoneAnimCopy 用于在blender中桥接骨骼动画的插件 项目地址: https://gitcode.com/gh_mirrors/bl/blender_BoneAnimCopy 在3D动画制作领域,动画…...
逆流而上,逐光而行:光伏微逆的技术探索之路
交错反激光伏并网微逆:软件源程序硬件资料详细设计说明文档 产品介绍: 本项目用于单相光伏并网微型逆变器。 前级采用交错反激拓扑生成馒头波,后级采用SCR拓扑反向得到正弦波,带有:MPPT、锁相环、孤岛检测。 本项目支持…...
async-http-client原生镜像大小优化:GraalVM裁剪终极指南 [特殊字符]
async-http-client原生镜像大小优化:GraalVM裁剪终极指南 🚀 【免费下载链接】async-http-client Asynchronous Http and WebSocket Client library for Java 项目地址: https://gitcode.com/gh_mirrors/as/async-http-client 在当今云原生和微服…...
