現代化Android開發:Compose提示信息的最佳封裝方案

在 Android 開發中,良好的用戶反饋機制至關重要。Jetpack Compose 提供了現代化的 UI 構建方式,但提示信息(Toast/Snackbar)的管理往往顯得分散。本文將介紹如何優雅地封裝提示信息,提升代碼可維護性。

一、基礎封裝方案

1. 簡單 Snackbar 封裝

@Composable
fun SnackbarHelper(hostState: SnackbarHostState,message: String?,duration: SnackbarDuration = SnackbarDuration.Short,actionLabel: String? = null,onAction: (() -> Unit)? = null,onDismiss: () -> Unit = {}
) {val scope = rememberCoroutineScope()LaunchedEffect(message) {message?.let {hostState.showSnackbar(message = it,duration = duration,actionLabel = actionLabel).also { result ->if (result == SnackbarResult.ActionPerformed) {onAction?.invoke()}}onDismiss()}}
}

2. 簡單 Toast 封裝

@Composable
fun ToastHelper(message: String?) {val context = LocalContext.currentLaunchedEffect(message) {message?.let {Toast.makeText(context, it, Toast.LENGTH_SHORT).show()}}
}

二、進階狀態管理方案

1. 消息狀態模型

sealed class MessageState {object Idle : MessageState()data class Snackbar(val message: String,val duration: SnackbarDuration = SnackbarDuration.Short,val action: SnackbarAction? = null) : MessageState()data class Toast(val message: String) : MessageState()
}data class SnackbarAction(val label: String,val onClick: () -> Unit,val withDismiss: Boolean = true
)

2. 消息管理器 ViewModel

class MessageManager : ViewModel() {private val _messageState = mutableStateOf<MessageState>(MessageState.Idle)val messageState: State<MessageState> = _messageStatefun showSnackbar(message: String,duration: SnackbarDuration = SnackbarDuration.Short,action: SnackbarAction? = null) {_messageState.value = MessageState.Snackbar(message, duration, action)}fun showToast(message: String) {_messageState.value = MessageState.Toast(message)}fun reset() {_messageState.value = MessageState.Idle}
}

3. 消息處理器組件

@Composable
fun MessageHandler(state: MessageState,snackbarHostState: SnackbarHostState,onMessageShown: () -> Unit
) {val context = LocalContext.currentLaunchedEffect(state) {when (state) {is MessageState.Snackbar -> {val result = snackbarHostState.showSnackbar(message = state.message,duration = state.duration,actionLabel = state.action?.label)if (result == SnackbarResult.ActionPerformed) {state.action?.onClick?.invoke()}if (state.action?.withDismiss != false) {onMessageShown()}}is MessageState.Toast -> {Toast.makeText(context, state.message, Toast.LENGTH_SHORT).show()onMessageShown()}MessageState.Idle -> Unit}}
}

三、完整使用示例

1. 項目級封裝

@Composable
fun MessageScaffold(messageManager: MessageManager = viewModel(),content: @Composable (PaddingValues) -> Unit
) {val snackbarHostState = remember { SnackbarHostState() }Scaffold(snackbarHost = { SnackbarHost(hostState = snackbarHostState) }) { padding ->Box(modifier = Modifier.fillMaxSize()) {content(padding)MessageHandler(state = messageManager.messageState.value,snackbarHostState = snackbarHostState,onMessageShown = { messageManager.reset() })}}
}

2. 具體頁面使用

@Composable
fun ProductDetailScreen() {val messageManager: MessageManager = viewModel()MessageScaffold {Column(modifier = Modifier.padding(it)) {// 頁面內容...Button(onClick = {messageManager.showSnackbar(message = "商品已加入購物車",action = SnackbarAction(label = "查看",onClick = { /* 導航到購物車 */ }))}) {Text("加入購物車")}Button(onClick = {messageManager.showToast("收藏成功")}) {Text("收藏商品")}}}
}

四、高級功能擴展

1. 消息隊列支持

class QueuedMessageManager : ViewModel() {private val _messageQueue = mutableStateListOf<MessageState>()private var isProcessing = falsefun sendMessage(message: MessageState) {_messageQueue.add(message)processNext()}private fun processNext() {if (isProcessing || _messageQueue.isEmpty()) returnisProcessing = true_currentMessage.value = _messageQueue.removeAt(0)}fun onMessageProcessed() {isProcessing = falseprocessNext()}// 其余實現與基礎MessageManager類似...
}

2. 自動消失控制

fun MessageManager.showTimedSnackbar(message: String,durationMillis: Long = 3000,action: SnackbarAction? = null
) {showSnackbar(message = message,duration = if (action != null) SnackbarDuration.Indefinite else SnackbarDuration.Short,action = action)if (action == null) {viewModelScope.launch {delay(durationMillis)reset()}}
}

五、最佳實踐建議

  1. 統一入口:所有提示信息通過同一管理器發出
  2. 狀態集中:使用密封類管理所有提示狀態
  3. 自動清理:消息顯示后自動重置狀態
  4. 可擴展性:設計應考慮未來可能的消息類型擴展
  5. 測試友好:ViewModel 應易于單元測試

六、總結

通過這種封裝方式,我們獲得了:

  • 統一的提示信息管理入口
  • 類型安全的提示狀態處理
  • 良好的代碼組織和可維護性
  • 易于擴展的新消息類型支持
  • 簡化的業務代碼調用方式

這種模式特別適合中大型項目,能夠有效管理應用中的各種用戶反饋信息,使開發者可以更專注于核心業務邏輯的實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77350.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77350.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77350.shtml

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

相關文章

【C++語法】類和對象(2)

4.類和對象&#xff08;2&#xff09; 文章目錄 4.類和對象&#xff08;2&#xff09;類的六個默認成員函數(1)構造函數&#xff1a;構造函數特點含有缺省參數的構造函數構造函數特點&#xff08;續&#xff09;注意事項構造函數補充 前面總結了有關對象概念&#xff0c;對比 C…

【自然語言處理與大模型】vLLM部署本地大模型②

舉例上一篇文章已經過去了幾個月&#xff0c;大模型領域風云變幻&#xff0c;之前的vLLM安裝稍有過時&#xff0c;這里補充一個快速安裝教程&#xff1a; # 第一步&#xff1a;創建虛擬環境并激活進入 conda create -n vllm-0.8.4 python3.10 -y conda activate vllm-0…

26 Arcgis軟件常用工具有哪些

一、畫圖改圖工具&#xff08;矢量編輯&#xff09;? ?挪位置工具&#xff08;移動工具&#xff09;? 干哈的&#xff1f;?選中要素?&#xff08;比如地塊、道路&#xff09;直接拖到新位置&#xff0c;或者用坐標?X/Y偏移?批量移動&#xff0c;適合“整體搬家”。 ?磁…

QNX/LINUX/Android系統動態配置動態庫.so文件日志打印級別的方法

背景 通常我們會在量產的產品上&#xff0c;配置軟件僅打印少量日志&#xff0c;以提升產品的運行性能。同時我們要考慮預留方法讓軟件能夠擁有能力可以在燒錄版本后能夠通過修改默寫配置&#xff0c;打印更多日志。因為量產后的軟件通常開啟熔斷與加密&#xff0c;不能夠輕松…

WebGL圖形編程實戰【4】:光影交織 × 逐片元光照與渲染技巧

現實世界中的物體被光線照射時&#xff0c;會反射一部分光。只有當反射光線進人你的眼睛時&#xff0c;你才能夠看到物體并辯認出它的顏色。 光源類型 平行光&#xff08;Directional Light&#xff09;&#xff1a;光線是相互平行的&#xff0c;平行光具有方向。平行光可以看…

【Hive入門】Hive基礎操作與SQL語法:DDL操作全面指南

目錄 1 Hive DDL操作概述 2 數據庫操作全流程 2.1 創建數據庫 2.2 查看數據庫 2.3 使用數據庫 2.4 修改數據庫 2.5 刪除數據庫 3 表操作全流程 3.1 創建表 3.2 查看表信息 3.3 修改表 3.4 刪除表 4 分區與分桶操作 4.1 分區操作流程 4.2 分桶操作 5 最佳實踐與…

YOLO數據處理

YOLO&#xff08;You Only Look Once&#xff09;的數據處理流程是為了解決目標檢測領域的核心挑戰&#xff0c;核心目標是為模型訓練和推理提供高效、規范化的數據輸入。其設計方法系統性地解決了以下關鍵問題&#xff0c;并對應發展了成熟的技術方案&#xff1a; 一、解決的問…

Ubuntu-Linux中vi / vim編輯文件,保存并退出

1.打開文件 vi / vim 文件名&#xff08;例&#xff1a; vim word.txt &#xff09;。 若權限不夠&#xff0c;則在前方添加 sudo &#xff08;例&#xff1a;sudo vim word.txt &#xff09;來增加權限&#xff1b; 2.進入文件&#xff0c;按 i 鍵進入編輯模式。 3.編輯結…

PCL繪制點云+法線

讀取的點云ASCII碼文件&#xff0c;每行6個數據&#xff0c;3維坐標3維法向 #include <iostream> #include <fstream> #include <vector> #include <string> #include <pcl/point_types.h> #include <pcl/point_cloud.h> #include <pc…

如何在學習通快速輸入答案(網頁版),其他學習平臺通用,手機上快速粘貼

目錄 1、網頁版&#xff08;全平臺通用&#xff09; 2、手機版&#xff08;學習通&#xff0c;其他平臺有可能使用&#xff09; 1、網頁版&#xff08;全平臺通用&#xff09; 1、首先CtrlC復制好答案 2、在學習通的作業里輸入1 3、對準1&#xff0c;然后鼠標右鍵 &#xff…

002 六自由度舵機機械臂——姿態解算理論

00 DH模型的核心概念 【全程干貨【六軸機械臂正逆解計算及仿真示例】】 如何實現機械臂的逆解計算-機器譜-robotway DH模型是機器人運動學建模的基礎方法&#xff0c;通過??四個參數??描述相鄰關節坐標系之間的變換關系。其核心思想是將復雜的空間位姿轉換分解為繞軸旋轉…

pymongo功能整理與基礎操作類

以下是 Python 與 PyMongo 的完整功能整理&#xff0c;涵蓋基礎操作、高級功能、性能優化及常見應用場景&#xff1a; 1. 安裝與連接 (1) 安裝 PyMongo pip install pymongo(2) 連接 MongoDB from pymongo import MongoClient# 基礎連接&#xff08;默認本地&#xff0c;端口…

Trae+DeepSeek學習Python開發MVC框架程序筆記(四):使用sqlite存儲查詢并驗證用戶名和密碼

繼續通過Trae向DeepSeek發問并修改程序&#xff0c;實現程序運行時生成數據庫&#xff0c;用戶在系統登錄頁面輸入用戶名和密碼后&#xff0c;控制器通過模型查詢用戶數據庫表來驗證用戶名和密碼&#xff0c;驗證通過后顯示登錄成功頁面&#xff0c;驗證失敗則顯示登錄失敗頁面…

如何識別金融欺詐行為并進行分析預警

金融行業以其高效便捷的服務深刻改變了人們的生活方式。然而,伴隨技術進步而來的,是金融欺詐行為的日益猖獗。從信用卡盜刷到復雜的龐氏騙局,再到網絡釣魚和洗錢活動,金融欺詐的形式層出不窮,其規模和影響也在不斷擴大。根據全球反欺詐組織(ACFE)的最新報告,僅2022年,…

紛析云:開源財務管理軟件的創新與價值

在企業數字化轉型中&#xff0c;紛析云作為一款優秀的開源財務管理軟件&#xff0c;正為企業財務管理帶來新變革&#xff0c;以下是其核心要點。 一、產品概述與技術架構 紛析云采用微服務架構&#xff0c;功能組件高內聚低耦合&#xff0c;可靈活擴展和定制。前端基于現代框…

蛋白質大語言模型ESM介紹

ESM(Evolutionary Scale Modeling)是 Meta AI Research 團隊開發的一系列用于蛋白質的預訓練語言模型。這些模型在蛋白質結構預測、功能預測和蛋白質設計等領域展現出了強大的能力。以下是對 ESM 的詳細介紹: 核心特點 大規模預訓練:基于大規模蛋白質序列數據進行無監督學…

OpenCv高階(七)——圖像拼接

目錄 一、圖像拼接的原理過程 1. 特征檢測與描述&#xff08;Feature Detection & Description&#xff09; 2. 特征匹配&#xff08;Feature Matching&#xff09; 3. 圖像配準&#xff08;Image Registration&#xff09; 4. 圖像變換與投影&#xff08;Warping&…

Native層Trace監控性能

一、基礎實現方法 1.1 頭文件引用 #include <utils/Trace.h> // 基礎版本 #include <cutils/trace.h> // 兼容舊版本1.2 核心宏定義 // 區間追蹤&#xff08;推薦&#xff09; ATRACE_BEGIN("TraceTag"); ...被監控代碼... ATRACE_END();// 函數級自…

金融行業微服務架構設計與挑戰 - Java架構師面試實戰

金融行業微服務架構設計與挑戰 - Java架構師面試實戰 本文通過模擬一位擁有十年Java研發經驗的資深架構師馬架構與面試官之間的對話&#xff0c;深入探討了金融行業項目在微服務架構下的技術挑戰與解決方案。 第一輪提問 面試官&#xff1a; 馬架構&#xff0c;請介紹一下您…

服務器虛擬化:技術解析與實踐指南

在信息技術飛速發展的今天,企業對服務器資源的需求日益增長,傳統物理服務器存在資源利用率低、部署周期長、管理成本高等問題。服務器虛擬化技術應運而生,它通過將物理服務器的計算、存儲、網絡等資源進行抽象和整合,劃分成多個相互隔離的虛擬服務器,從而提高資源利用率、…