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

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

自定义事件总线

Kotlin 复制代码
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 实现事件总线

Kotlin 复制代码
import androidx.compose.runtime.*
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow

object FlowEventBus {
    private val eventFlow = MutableSharedFlow<Any>()
    val events: SharedFlow<Any> = eventFlow

    suspend 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 实现事件总线是更好的选择。

相关推荐
Gain_chance2 小时前
34-学习笔记尚硅谷数仓搭建-DWS层最近一日汇总表建表语句汇总
数据仓库·hive·笔记·学习·datagrip
Gain_chance3 小时前
36-学习笔记尚硅谷数仓搭建-DWS层数据装载脚本
大数据·数据仓库·笔记·学习
肖永威4 小时前
macOS环境安装/卸载python实践笔记
笔记·python·macos
Libraeking4 小时前
视觉篇:Canvas 自定义绘图与高级动画的华丽圆舞曲
android·经验分享·android jetpack
暗光之痕4 小时前
Unreal5研究笔记 Actor的生命周期函数
笔记·unreal engine
Gain_chance4 小时前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
宵时待雨5 小时前
STM32笔记归纳9:定时器
笔记·stm32·单片机·嵌入式硬件
m0_719084115 小时前
React笔记张天禹
前端·笔记·react.js
r i c k8 小时前
数据库系统学习笔记
数据库·笔记·学习
shandianchengzi9 小时前
【小白向】错位排列|图文解释公考常见题目错位排列的递推式Dn=(n-1)(Dn-2+Dn-1)推导方式
笔记·算法·公考·递推·排列·考公