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…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
