Compose筆記(十三)--事件總線

? ? ? ?這一節了解一下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.pswp.cn/bicheng/74841.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74841.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74841.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python的inspect模塊

在Python編程中&#xff0c;**inspect**模塊是一個強大的工具包&#xff0c;它提供了一系列函數來獲取對象的信息&#xff0c;主要用于獲取對象的源代碼、參數信息、類繼承關系、方法屬性等。這對于調試、自動化文檔生成、代碼分析等場景都非常有用。本文將詳細介紹inspect模塊…

2025跳槽學習計劃

&#xff08;1&#xff09;編程基礎&#xff1a; 目錄學習資料Chttps://www.bilibili.com/video/BV1z64y1U7hs?spm_id_from333.1387.favlist.content.clickLinuxPytorchhttps://www.bilibili.com/video/BV1if4y147hS?spm_id_from333.1387.favlist.content.clickopencv數據結…

WebRTC簡介及應用

WebRTC&#xff08;Web Real-Time Communication&#xff09;是一種支持瀏覽器和移動設備進行實時音視頻通信的技術&#xff0c;無需安裝插件或額外的軟件。它是一個開放標準&#xff0c;最初由Google推動&#xff0c;并被W3C&#xff08;萬維網聯盟&#xff09;和IETF&#xf…

【C語言】分支與循環(上)

前言&#xff1a;C語言是由順序結構、選擇結構、循環結構組成的結構化的程序設計語言。 那C語言是如何設計和實現這些結構的呢&#xff1f;話不多說&#xff0c;馬上開始。 三種結構如圖所示&#xff1a; 我們可以使用 if else語句、 switch語句 來實現選擇&#xff08;分支&am…

一次與chatgpt關于VO的深入討論。

我&#xff1a; {"usageRate":50,"projectInfo":[{"productName":"長江一號","deviceInfo":[{"deviceName":"AA","num":10},{"deviceName":"BB","num":3}]},…

Springboot學習筆記3.20

目錄 1.實戰篇第一課 我們將會在本次實戰中學習到哪些知識點&#xff1f; 開發模式和環境搭建&#xff1a; 注冊接口 1.Lombok 2.開發流程 1.controller層&#xff0c;這個層會指明訪問路徑和要執行的邏輯&#xff1a; 2.我們把返回結果根據接口文檔包裝成一個類result&a…

docker save如何遷移鏡像更節省空間?

文章目錄 方法一&#xff1a;使用docker save命令方法二&#xff1a;直接保存多個鏡像到一個tar文件哪個方法更節省磁盤空間&#xff1f;空間效率對比實際測試示例其他優勢結論 如何用腳本遷移加載鏡像 遷移鏡像時候&#xff0c;往往會碰到基礎鏡像相同的很多鏡像需要遷移&…

全新升級 | Built For You Spring ‘25 發布,Fin 智能客服實現新突破!

圖像識別、語音交互、任務自動化&#xff0c;立即體驗智能客服蛻變&#xff01; 上周&#xff0c;Intercom 舉辦了 Built For You Spring 25 發布會&#xff0c;正式揭曉了 AI Agent Fin 的一系列令人振奮的更新。Fin 正在以前所未有的速度革新客戶支持模式——它已經成功解決了…

需求導向的K8S網絡原理分析:Kube-proxy、Flannel、Calico的地位和作用

最近發現自己似乎從來沒學明白過Kubernetes網絡通信方案&#xff0c;特開一貼復習總結一下。 在k8s中&#xff0c;每個 Pod 都擁有一個獨立的 IP 地址&#xff0c;而且假定所有 Pod 都在一個可以直接連通的、扁平的網絡空間中。所以不管它們是否允許在同一個 Node&#xff08;宿…

Vulnhub:Digitalword.local: FALL靶機滲透

將靶機按照圖中連接方式打開&#xff0c;fall在virtualBox中打開 信息收集 掃描得ip arp-scan -l 掃描端口 nmap -A -T4 -sV -p- 掃描目錄 gobuster dir -u http://192.168.117.160 -x php,txt,html -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt 一個一個…

4、網工軟考—VLAN配置—hybird配置

1、實驗環境搭建&#xff1a; 2、實驗過程 SW1&#xff1a; 先創建vlan2和vlan3 [Huawei-Ethernet0/0/2]port link-type hybrid //hybird端口 [Huawei-Ethernet0/0/2]port hybrid pvid vlan 2 [Huawei-Ethernet0/0/2]port hybrid untagged vlan 10 //撕掉vlan10的標簽 …

【OCR】技術

OCR圖像識別 一、OCR是什么二、Python中如何實現OCR1.簡單應用 三、OCR的核心步驟1.?圖像預處理?&#xff08;提高識別準確率&#xff09;2.?文字識別3.?輸出結果 四、OCR到的應用場景五、注意事項六、擴展學習 此貼用來更新在工作中遇到的一些圖片解析內容 一、OCR是什么 …

深入理解 dispatchEvent:前端事件觸發的藝術

dispatchEvent 是 DOM 元素的一個方法&#xff0c;用于手動觸發/派發一個事件。這個方法允許開發者以編程方式觸發事件&#xff0c;而不是等待用戶交互或瀏覽器自動觸發。 1.基本概念 作用&#xff1a;dispatchEvent 用于在指定的 DOM 節點上觸發一個事件 使用場景&#xff1…

2025年數智化電商產業帶發展研究報告260+份匯總解讀|附PDF下載

原文鏈接&#xff1a;https://tecdat.cn/?p41286 在數字技術與實體經濟深度融合的當下&#xff0c;數智化產業帶正成為經濟發展的關鍵引擎。 從云南鮮花產業帶的直播熱銷到深圳3C數碼的智能轉型&#xff0c;數智化正重塑產業格局。2023年數字經濟規模突破53.9萬億元&#xff…

【深度學習】【目標檢測】【OnnxRuntime】【C++】YOLOV5模型部署

【深度學習】【目標檢測】【OnnxRuntime】【C】YOLOV5模型部署 提示:博主取舍了很多大佬的博文并親測有效,分享筆記邀大家共同學習討論 文章目錄 【深度學習】【目標檢測】【OnnxRuntime】【C】YOLOV5模型部署前言Windows平臺搭建依賴環境模型轉換--pytorch轉onnxONNXRuntime推…

深入解析 JSON-RPC:從基礎到高級應用(附調用示例)

在當今的軟件開發領域&#xff0c;遠程過程調用&#xff08;RPC&#xff09;技術是實現分布式系統間通信的關鍵手段之一。JSON-RPC&#xff0c;作為一種基于 JSON 數據格式的輕量級 RPC 協議&#xff0c;因其簡潔性和高效性而備受青睞。本文將全面深入地探討 JSON-RPC 的核心概…

抽象代數:群論

系列筆記為本學期上抽象代數課整理的&#xff0c;持續更新。 群的相關定義 群的定義 群是一個帶有滿足結合律、單位元、逆元的二元運算的集合&#xff0c;記作 ( G , ? ) \left({G, \cdot}\right) (G,?)。若群運算滿足結合律&#xff0c;則該集合構成半群。如果該半群中含…

線程同步——讀寫鎖

Linux——線程同步 讀寫鎖 目錄 一、基本概念 1.1 讀寫鎖的基本概念 1.2 讀寫鎖的優點 1.3 讀寫鎖的實現 1.4 代碼實現 一、基本概念 線程同步中的讀寫鎖&#xff08;Read-Write Lock&#xff09;&#xff0c;也常被稱為共享-獨占鎖&#xff08;Shared-Exclusive Lock&a…

全面解析PRN文件:從原理到可視化的完整指南 【標簽打印】

文章目錄 一、PRN文件概述二、PRN文件結構深度解析2.1 文件頭配置2.1 繪圖指令詳解2.3 文本處理方案2.4 條碼/二維碼實現2.5 RFID指令集 三、實戰&#xff1a;PRN可視化工具開發3.1 基于Canvas的實現方案3.2 坐標轉換關鍵算法 四、常見問題解決方案4.1 內容偏移問題4.2 中文亂碼…

C++:函數(通識版)

一、函數的基礎 1.什么是函數&#xff1f;&#xff08;獨立的功能單位&#xff09; 函數是C中封裝代碼邏輯的基本單元&#xff0c;用于執行特定任務。 作用&#xff1a;代碼復用、模塊化、提高可讀性。 2、函數的基本結構 返回類型 函數名(參數列表) {// 函數體return 返回值…