Flutter 學習之旅 之 flutter 不使用插件,實現簡單帶加載動畫的 LoadingToast 功能

Flutter 學習之旅 之 flutter 不使用插件,實現簡單帶加載動畫的 LoadingToast 功能

目錄

Flutter 學習之旅 之 flutter 不使用插件,實現簡單帶加載動畫的 LoadingToast 功能

一、簡單介紹

二、LoadingToast

三、簡單案例實現

四、關鍵代碼


一、簡單介紹

Flutter 是一款開源的 UI 軟件開發工具包,由 Google 開發和維護。它允許開發者使用一套代碼同時構建跨平臺的應用程序,包括移動設備(iOS 和 Android)、Web 和桌面平臺(Windows、macOS 和 Linux)。

Flutter 使用 Dart 編程語言,它可以將代碼編譯為 ARM 或 Intel 機器代碼以及 JavaScript,從而實現快速的性能。Flutter 提供了一個豐富的預置小部件庫,開發者可以根據自己的需求靈活地控制每個像素,從而創建自定義的、適應性強的設計,這些設計在任何屏幕上都能呈現出色的外觀和感覺。

二、LoadingToast

LoadingToast 是一種用戶界面元素,通常用于移動和桌面應用程序中,以向用戶顯示一個過程正在進行中,比如數據加載或后臺任務處理。在Flutter框架中,LoadingToast可以通過一個浮動的圖形用戶界面(GUI)元素實現,這個元素通常包含一個旋轉的加載圖標和/或相應的文字提示,如“正在加載”或“請稍候”。

LoadingToast的設計目的是提高用戶體驗,通過提供即時的視覺反饋來告知用戶應用程序沒有凍結或停止響應,而是在后臺進行操作。這種提示有助于減少用戶的焦慮感,并增強對應用程序的信任感。在Flutter中實現LoadingToast,可以通過Overlay或其他類似的機制來創建一個覆蓋在應用主界面上的浮動提示框。

在使用LoadingToast進行開發時,應注意以下幾個關鍵事項以確保最佳用戶體驗和代碼的健壯性:

  1. 全局訪問:確保LoadingToast的顯示和隱藏方法可以在應用的任何地方被調用。這通常通過使用GlobalKey和靜態方法實現。

  2. 性能考慮:由于LoadingToast是一個覆蓋在應用主界面上的浮動元素,頻繁地顯示和隱藏可能會影響應用性能。應優化其顯示邏輯,避免不必要的渲染。

  3. 用戶體驗LoadingToast應僅在必要時顯示,以避免干擾用戶操作或分散用戶注意力。同時,應提供清晰的信息,讓用戶了解當前正在進行的操作。

  4. 可訪問性:考慮到不同用戶的需求,LoadingToast應包含適當的文本描述,以支持屏幕閱讀器等輔助技術。

  5. 多任務處理:在多任務或長時間運行的操作中,應確保LoadingToast能夠正確地顯示和更新,以反映操作的進度或狀態。

  6. 錯誤處理:在操作失敗或出現錯誤時,應提供一種機制來更新LoadingToast的內容或隱藏它,并給出相應的錯誤信息。

  7. 樣式一致性LoadingToast的樣式應與應用的整體設計和風格保持一致,以提供統一的用戶體驗。

  8. 測試:在開發過程中,應充分測試LoadingToast在不同場景下的行為,包括快速連續觸發顯示和隱藏的情況。

  9. 資源管理:確保在LoadingToast不再需要時正確地移除和清理資源,避免內存泄漏。

  10. 自定義:根據應用的具體需求,可能需要對LoadingToast進行自定義,如調整位置、大小、顏色等,以適應不同的用戶界面布局。

通過注意這些事項,可以確保LoadingToast不僅能夠有效地傳達信息,還能增強應用的整體質量和用戶滿意度。

這個案例的實現過程主要涉及創建一個自定義的加載提示,它可以在Flutter應用中以懸浮窗的形式顯示。以下是實現過程的簡單介紹:

  1. 定義LoadingToast

    • 創建一個名為LoadingToast的類,用于封裝加載提示的顯示和隱藏邏輯。

  2. 使用OverlayEntry

    • LoadingToast類中定義一個靜態的OverlayEntry?類型的變量_overlayEntry,用于存儲創建的懸浮窗實例,以便之后可以移除它。

  3. 創建navigatorKey

    • 定義一個靜態的GlobalKey<NavigatorState>類型的變量navigatorKey,用于訪問應用的Navigator,從而獲取到Overlay

  4. 實現show方法

    • LoadingToast類中實現一個靜態的show方法,該方法接受一個BuildContext和一個String類型的message作為參數。

    • show方法中,首先獲取OverlayState,如果為空,則打印錯誤信息并返回。

    • 創建一個新的OverlayEntry實例,其builder屬性返回一個Material widget,該widget包含一個透明的背景和一個居中的Center widget。

    • Center widget中包含另一個Material widget,用于顯示加載提示的背景和內容,如加載圖標和文本信息。

    • 將創建的OverlayEntry實例插入到Overlay中,以顯示加載提示。

  5. 實現remove方法

    • LoadingToast類中實現一個靜態的remove方法,用于移除顯示的加載提示。

    • 如果_overlayEntry不為空,則調用其remove方法移除懸浮窗,并將其設置為null。

  6. main函數中使用LoadingToast

    • main函數中創建并運行MyApp應用。

    • MyAppbuild方法中,使用MaterialApp并設置navigatorKey

    • Scaffoldbody中添加一個ElevatedButton,當按鈕被點擊時,調用LoadingToast.show方法顯示加載提示,并在3秒后調用LoadingToast.remove方法隱藏提示。

通過以上步驟,我們實現了一個可以在Flutter應用中顯示和隱藏的自定義加載提示Toast組件。這個組件可以用于在執行長時間操作時向用戶顯示加載狀態,提高用戶體驗。

三、簡單案例實現

1、這里使用 Android Studio 進行創建 Flutter 項目

2、創建一個 application 的 Flutter 項目

3、初次的項目結構如下

4、編寫一個 LoadingToast 邏輯,實現 show 調用

5、在 main 中調用Loading 功能

6、連接設備,運行效果如下

四、關鍵代碼

1、LoadingToast

import 'package:flutter/material.dart';class LoadingToast {// 定義一個靜態的OverlayEntry?類型的變量,用于存儲Toast的OverlayEntry實例,以便后續可以移除它static OverlayEntry? _overlayEntry;// 定義一個靜態的GlobalKey,用于訪問NavigatorState,進而獲取Overlaystatic final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();/// 顯示加載提示Toast的靜態方法static void show(BuildContext context, String message) {// 獲取當前NavigatorState的OverlayStatefinal OverlayState? overlayState = navigatorKey.currentState?.overlay;// 如果overlayState為空,則打印錯誤信息并返回if (overlayState == null) {print("[LoadingToast] show : OverlayState is null. Make sure to use MaterialApp with navigatorKey.");return;}// 創建一個新的OverlayEntry實例_overlayEntry = OverlayEntry(builder: (context) {// 返回一個Material widget,設置顏色為透明,作為Toast的背景return Material(color: Colors.transparent,// 設置Material的子widget為Center,用于居中顯示Toastchild: Center(child: Material(// 設置Toast背景顏色為半透明黑色color: Colors.black.withOpacity(0.8),// 設置Toast背景的圓角shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0),),// 設置Material的子widget為Padding,用于添加內邊距child: Padding(padding: const EdgeInsets.all(16.0), // 設置內邊距大小child: Column(mainAxisSize: MainAxisSize.min, // 設置Column的主軸尺寸為最小children: <Widget>[// 添加一個CircularProgressIndicator作為加載提示CircularProgressIndicator(strokeWidth: 2,// 設置加載提示的顏色為白色valueColor: AlwaysStoppedAnimation<Color>(Colors.white),),SizedBox(height: 8), // 設置加載提示和文本之間的間距// 添加一個Text widget作為Toast的消息文本Text(message,style: TextStyle(color: Colors.white, // 設置文本顏色為白色fontSize: 16, // 設置文本字體大小),),],),),),),);},);// 將OverlayEntry實例插入到Overlay中,以顯示ToastoverlayState.insert(_overlayEntry!);}/// 移除加載提示Toast的靜態方法static void remove() {// 如果存在_overlayEntry實例,則移除它并將其設置為nullif (_overlayEntry != null) {_overlayEntry!.remove();_overlayEntry = null;}}
}

這段代碼定義了一個名為LoadingToast的類,該類提供了兩個靜態方法:showremoveshow方法用于顯示一個加載提示Toast,而remove方法用于移除該Toast。Toast的顯示是通過創建一個OverlayEntry實例并將其插入到Overlay中實現的。Toast的移除是通過調用OverlayEntryremove方法實現的。

2、main

import 'package:flutter/material.dart';
// 引入自定義的LoadingToast類,該類負責顯示和隱藏加載提示Toast
import 'package:test_loading_toast/loading_toast.dart';void main() {// 運行Flutter應用程序runApp(MyApp());
}// 定義應用程序的根組件MyApp
class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {// 返回MaterialApp組件,它是Flutter應用程序的主要入口點return MaterialApp(// 設置navigatorKey,這是為了確保LoadingToast類能夠訪問到OverlaynavigatorKey: LoadingToast.navigatorKey,// 設置MaterialApp的主頁為Scaffold組件home: Scaffold(// 設置Scaffold的AppBar,其中包含一個標題appBar: AppBar(title: Text('Loading Toast Example'),),// 設置Scaffold的主體為Center組件,其中包含一個Columnbody: Center(// 設置Column的mainAxisAlignment屬性為MainAxisAlignment.center,使其子組件垂直居中child: Column(mainAxisAlignment: MainAxisAlignment.center,// 設置Column的子組件為一個ElevatedButtonchildren: <Widget>[ElevatedButton(// 設置按鈕的點擊事件處理函數onPressed: () {// 調用LoadingToast的show方法顯示加載提示ToastLoadingToast.show(context, '正在加載');// 使用Future.delayed模擬異步操作,并在3秒后調用LoadingToast的remove方法隱藏ToastFuture.delayed(Duration(seconds: 3)).then((_) {LoadingToast.remove();});},// 設置按鈕的子組件為Text,顯示按鈕的文本child: Text('Show Loading Toast'),),],),),),);}
}

這段代碼定義了一個簡單的Flutter應用程序,其中包含一個按鈕。當按鈕被點擊時,它將顯示一個加載提示Toast,并在3秒后自動隱藏。LoadingToast類負責管理Toast的顯示和隱藏,它通過操作Overlay來實現Toast的顯示效果。

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

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

相關文章

Spring (八)AOP-切面編程的使用

目錄 實現步驟&#xff1a; 1 導入AOP依賴 2 編寫切面Aspect 3 編寫通知方法 4 指定切入點表達式 5 測試AOP動態織入 圖示&#xff1a; 一 實現步驟&#xff1a; 1 導入AOP依賴 <!-- Spring Boot AOP依賴 --><dependency><groupId>org.springframewor…

開源數字人模型Heygem

一、Heygem是什么 Heygem 是硅基智能推出的開源數字人模型&#xff0c;專為 Windows 系統設計。基于先進的AI技術&#xff0c;僅需1秒視頻或1張照片&#xff0c;能在30秒內完成數字人形象和聲音克隆&#xff0c;在60秒內合成4K超高清視頻。Heygem支持多語言輸出、多表情動作&a…

uniapp開通開屏廣告后動態開啟或關閉開屏廣告

近期使用uniapp開發的APP有uniad的廣告對接&#xff0c;并且要求會員用戶不顯示包含開屏廣告在內的廣告&#xff0c;除開屏廣告外的廣告都可以通過uniapp廣告組件控制是否顯示 因uniad的開屏廣告無需代碼開發&#xff0c;經過uniad客服指點可在App.vue中的onLaunch生命周期中執…

神經網絡為什么要用 ReLU 增加非線性?

在神經網絡中使用 ReLU&#xff08;Rectified Linear Unit&#xff09; 作為激活函數的主要目的是引入非線性&#xff0c;這是神經網絡能夠學習復雜模式和解決非線性問題的關鍵。 1. 為什么需要非線性&#xff1f; 1.1 線性模型的局限性 如果神經網絡只使用線性激活函數&…

使用SSH密鑰連接本地git 和 github

目錄 配置本地SSH&#xff0c;添加到github首先查看本地是否有SSH密鑰生成SSH密鑰&#xff0c;和郵箱綁定將 SSH 密鑰添加到 ssh-agent&#xff1a;顯示本地公鑰*把下面這一串生成的公鑰存到github上* 驗證SSH配置是否成功終端跳轉到本地倉庫把http協議改為SSH&#xff08;如果…

關于AI數據分析可行性的初步評估

一、結論&#xff1a;可在部分環節嵌入&#xff0c;無法直接處理大量數據 1.非本地部署的AI應用處理非機密文件沒問題&#xff0c;內部文件要注意數據安全風險。 2.AI&#xff08;指高規格大模型&#xff09;十分適合探索性研究分析&#xff0c;對復雜報告無法全流程執行&…

矩陣分析-淺要理解(深度學習方向)

梯度分析與最優化 在深度學習的任務中&#xff0c;我們所期望的是訓練一個神經網絡&#xff0c;使得預測結果與真實標簽之間的誤差最小化&#xff0c;這可以近似看作是一個提供梯度下降等優化找到全局最優解的凸優化問題。 奇異值分解 在信息工程領域&#xff0c;對數據處理的…

使用DeepSeek+藍耘快速設計網頁簡易版《我的世界》小游戲

前言&#xff1a;如今&#xff0c;借助先進的人工智能模型與便捷的云平臺&#xff0c;即便是新手開發者&#xff0c;也能開啟創意游戲的設計之旅。DeepSeek 作為前沿的人工智能模型&#xff0c;具備強大的功能與潛力&#xff0c;而藍耘智算云平臺則為其提供了穩定高效的運行環境…

固定表頭、首列 —— uniapp、vue 項目

項目實地&#xff1a;也可以在 【微信小程序】搜索體驗&#xff1a;xny.handbook 另一個體驗項目&#xff1a;官網 一、效果展示 二、代碼展示 &#xff08;1&#xff09;html 部分 <view class"table"><view class"tr"><view class&quo…

【學習筆記】Numpy和Tensor的區別

1. NumPy 和 PyTorch Tensor 的格式對比 NumPy 使用的是 numpy.ndarray&#xff0c;而 PyTorch 使用的是 torch.Tensor&#xff0c;兩者的格式在數據存儲和計算方式上有所不同。 NumPy (numpy.ndarray) import numpy as np array np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.…

每天一道算法題【藍橋杯】【在排序數組中查找元素的第一個位置和最后一個位置】

思路 本題為查找左邊界和右邊界的標準模型 查找左邊界 int left 0, right nums.size() - 1, mid 0; //查找左邊界 while (left < right) { mid left (right - left) / 2; if (nums[mid] < target) left mid 1; else right mid; } 查找右邊界 int left 0, r…

Python數據分析之機器學習基礎

Python 數據分析重點知識點 本系列不同其他的知識點講解&#xff0c;力求通過例子讓新同學學習用法&#xff0c;幫助老同學快速回憶知識點 可視化系列&#xff1a; Python基礎數據分析工具數據處理與分析數據可視化機器學習基礎 五、機器學習基礎 了解機器學習概念、分類及…

我與DeepSeek讀《大型網站技術架構》(10)- 維基百科的高性能架構設計分析

目錄 網站整體架構核心組件請求處理流程圖關鍵環節說明 性能優化策略前端優化&#xff1a;攔截 80% 以上請求服務端優化&#xff1a;高性能 PHP 集群后端優化&#xff1a;存儲與緩存極致設計Memcached 持久化連接 性能優化策略對比表 網站整體架構 核心組件 Wikipedia 的架構…

Excel多級聯動下拉菜單設置

1.問題描述 現有數據表如下圖所示&#xff1a; 該表中包括省、市、縣三級目錄。 現要將其整理成數據表模板&#xff0c;如下圖所示&#xff1a; 要求制作成下拉菜單的形式&#xff0c;且每一級目錄的下拉菜單列表要根據上一級目錄的內容來確定。 如上圖所示&#xff0c;只有…

智駕技術全鏈條解析

智駕技術全鏈條解析&#xff08;2025年最新版&#xff09; 智駕技術涵蓋從環境感知到車輛控制的完整閉環&#xff0c;涉及硬件、算法、數據與系統集成等多個領域。以下結合行業最新進展&#xff08;截至2025年3月&#xff09;進行深度拆解&#xff1a; 一、感知技術&#xff1…

SpringMVC執行的流程

SpringMVC 基于 MVC 架構模式&#xff0c;核心流程時前端控制室 DispathcherServlet 統一調度&#xff0c;通過組件協作完成 http 的請求與響應。 對于 dispatchServlet 作為前端請求的控制器&#xff0c;全局的訪問點&#xff0c;首先將根據 URL 調用 HandlerMapping 獲取 Han…

Linux學習(十五)(故障排除(ICMP,Ping,Traceroute,網絡統計,數據包分析))

故障排除是任何 Linux 用戶或管理員的基本技能。這涉及識別和解決 Linux 系統中的問題。這些問題的范圍包括常見的系統錯誤、硬件或軟件問題、網絡連接問題以及系統資源的管理。Linux 中的故障排除過程通常涉及使用命令行工具、檢查系統和應用程序日志文件、了解系統進程&#…

存儲過程和自定義函數在銀行信貸業務中的應用(oracle)

數據校驗和清洗 例如&#xff0c;檢查客戶的年齡是否在合理范圍內&#xff0c;貸款金額是否符合規定的上下限等。 對于不符合規則的數據&#xff0c;可以進行清洗和修正。比如&#xff0c;將空值替換為默認值&#xff0c;或者對錯誤的數據進行糾正。 CREATE OR REPLACE PROC…

指令微調 (Instruction Tuning) 與 Prompt 工程

引言 預訓練語言模型 (PLMs) 在通用語言能力方面展現出強大的潛力。然而&#xff0c;如何有效地引導 PLMs 遵循人類指令&#xff0c; 并輸出符合人類意圖的響應&#xff0c; 成為釋放 PLMs 價值的關鍵挑戰。 指令微調 (Instruction Tuning) 和 Prompt 工程 (Prompt Engineerin…

【c++】反轉字符串

說明 將string類型的字符串本身反轉 用到庫&#xff1a;algorithm 示例代碼 #include <iostream> #include <string> #include <algorithm> using namespace std;int main() {string str "123";reverse(str.begin(), str.end());cout <<…