Compose笔记(十三)--事件总线

devtools/2025/4/1 7:58:12/

       这一节了解一下Compose中的事件总线,在Jetpack Compose里,官方没有直接提供事件总线,但可以借助第三方库或者自定义实现来达成事件总线的功能,进而在不同的 Compose 控件间同步数据。

自定义事件总线

import androidx.compose.runtime.*
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import java.util.*object EventBus {private val listeners = mutableListOf<(Any) -> Unit>()fun register(listener: (Any) -> Unit) {listeners.add(listener)}fun unregister(listener: (Any) -> Unit) {listeners.remove(listener)}fun post(event: Any) {listeners.forEach { it(event) }}
}@Composable
fun SenderComponent() {Button(onClick = {EventBus.post("New data from sender")}) {Text(text = "Send Data")}
}@Composable
fun ReceiverComponent() {var receivedData by remember { mutableStateOf("No data received") }DisposableEffect(Unit) {val listener: (Any) -> Unit = { event ->if (event is String) {receivedData = event}}EventBus.register(listener)onDispose {EventBus.unregister(listener)}}Text(text = receivedData)
}@Composable
fun EventBusExample() {SenderComponent()ReceiverComponent()
}    

分析:EventBus 对象管理事件的注册、注销和发布。register 方法用于添加监听器,unregister 方法用于移除监听器,post 方法用于发布事件。

优点
简单易实现:自定义事件总线的实现方式比较基础,不需要引入额外的依赖库。可以根据自己的需求,用简单的集合和回调机制来实现一个基本的事件总线,对于小型项目或者简单的通信需求来说,实现成本较低。
灵活性高:可以完全按照自己的需求来设计事件总线的接口和功能。例如,你可以自定义事件的优先级、过滤规则等,满足一些特殊的业务需求。
缺点
缺乏响应式编程特性:自定义事件总线通常是基于回调机制实现的,不具备 Kotlin Flow 那样的响应式编程能力。在处理异步数据流、背压等复杂场景时,需要自己手动实现很多逻辑,增加了开发的复杂度。

使用 Kotlin Flow 实现事件总线

import androidx.compose.runtime.*
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlowobject FlowEventBus {private val eventFlow = MutableSharedFlow<Any>()val events: SharedFlow<Any> = eventFlowsuspend fun post(event: Any) {eventFlow.emit(event)}
}@Composable
fun FlowSenderComponent() {val scope = rememberCoroutineScope()Button(onClick = {scope.launch {FlowEventBus.post("New data from flow sender")}}) {Text(text = "Send Data with Flow")}
}@Composable
fun FlowReceiverComponent() {var receivedData by remember { mutableStateOf("No data received") }val scope = rememberCoroutineScope()LaunchedEffect(Unit) {FlowEventBus.events.collect { event ->if (event is String) {receivedData = event}}}Text(text = receivedData)
}@Composable
fun FlowEventBusExample() {FlowSenderComponent()FlowReceiverComponent()
}  

优点
响应式编程:Kotlin Flow 是 Kotlin 协程中的响应式编程库,具有强大的异步数据流处理能力。使用 Kotlin Flow 实现事件总线可以方便地处理异步事件、背压、过滤、转换等操作,使代码更加简洁和易于维护。
类型安全:Kotlin Flow 是类型安全的,编译器可以在编译时检查类型错误,减少运行时错误的发生。这使得代码更加健壮,易于调试和维护。
与协程集成:Kotlin Flow 与 Kotlin 协程紧密集成,可以方便地在协程中使用。在处理异步事件时,可以充分利用协程的特性,如挂起、恢复等,提高代码的性能和可读性。

缺点
学习成本高:Kotlin Flow 是一个相对复杂的库,需要一定的时间来学习和掌握其使用方法。对于初学者来说,可能会觉得难以理解和使用。
引入额外依赖:如果项目中原本没有使用 Kotlin Flow,引入它会增加项目的依赖和代码量。

       简而言之,若项目规模较小、通信需求简单,更适合使用自定义事件总线。若项目需要处理复杂的异步数据流、对代码的可维护性和可扩展性要求较高,那么使用 Kotlin Flow 实现事件总线是更好的选择。


http://www.ppmy.cn/devtools/172254.html

相关文章

PaddleX产线集成功能的使用整理

一、环境搭建 1.1 安装paddle-gpu 需要根据安装机器的cuda的版本&#xff0c;选择合适的版本进行安装 #安装paddle-gpu 官网链接 https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/pip/linux-pip.html python -m pip install paddle…

DQL语句-distinct去重

MySQL | DQL语句-distinct去重 &#x1fa84;个人博客&#xff1a;https://vite.xingji.fun 查询工作岗位 select job from emp;mysql> select job from emp;----------- | job | ----------- | CLERK | | SALESMAN | | SALESMAN | | MANAGER | | SALESMAN …

技术速递|为 .NET 的 AI 评估解锁新的可能性

作者&#xff1a;Wendy Breiding 排版&#xff1a;Alan Wang Microsoft.Extensions.AI.Evaluations 库旨在简化将 AI 评估流程集成到应用程序中的过程。它提供了一个强大的框架&#xff0c;用于评估您的 AI 应用程序并自动化评估其性能。 去年11月&#xff0c;我们发布了该库的…

诠视科技MR眼镜如何安装apk应用

诠视科技MR眼镜如何安装apk应用 1、使用adb工具安装1.1 adb工具下载1.2 解压adb文件1.3 使用adb安装apk 2、拷贝到文件夹安装 1、使用adb工具安装 1.1 adb工具下载 点击下面的链接开始下载adb工具&#xff0c;下载结束以后解压文件。 下载链接: https://download.xvisiotech…

智能家居赋能宠物经济:未来宠物行业的另一片蓝海

一、引言&#xff1a;宠物经济的范式转移 随着城市化进程的加速&#xff0c;宠物在现代家庭中的地位日益重要&#xff0c;宠物经济蓬勃发展。近年来&#xff0c;智能家居技术的兴起为宠物行业带来了新的变革&#xff0c;从传统的情感消费模式向技术赋能的精细化养宠模式转变。…

基于DrissionPage的TB商品信息采集与可视化分析

一、项目背景 随着电子商务的快速发展,淘宝作为中国最大的电商平台之一,拥有海量的商品信息。这些数据对于市场分析、用户行为研究以及竞争情报收集具有重要意义。然而,由于淘宝的反爬虫机制和复杂的页面结构,直接获取商品信息并不容易。尤其是在电商行业高速发展的今天,商…

性能测试理论基础-测试流程及方案设计要点

需求调研 因性能测试技术性和专业性要求比较高,通常需要性能测试人员参与需求调研和确认。 需求调研阶段,通常需要确认以下信息: 项目背景、测试范围、业务逻辑 & 数据流转(与开发确认)、系统架构、软硬件配置信息、 测试数据量(量级要一致)、外部依赖(第三方系统…

虚幻基础:UI

文章目录 控件蓝图可以装载其他控件蓝图可以安装其他蓝图接口 填充&#xff1a;相对于父组件填充水平框尺寸—填充—0.5&#xff1a;改变填充的尺寸填充—0.5&#xff1a;改变与父组件的距离 锚点&#xff1a;相对于父组件的控件坐标系原点&#xff0c;屏幕比例改变时&#xff…