Flutter 學習之旅 之 flutter 不使用插件,簡單實現一個 Toast 功能

Flutter 學習之旅 之 flutter 不使用插件,簡單實現一個 Toast 功能

目錄

Flutter 學習之旅 之 flutter 不使用插件,簡單實現一個 Toast 功能

一、簡單介紹

二、簡單介紹 Toast

1. 確保正確配置 navigatorKey

2. 避免重復顯示 Toast

3. 確保 Toast 的上下文正確

4. 注意 Toast 的顯示時長

三、簡單案例實現

四、關鍵代碼


一、簡單介紹

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

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

二、簡單介紹 Toast

在 Flutter 中,不使用 Toast 插件,可以通過 OverlayTimer 實現簡單 Toast 功能。創建一個透明的 OverlayEntry,在其上顯示自定義文本,設置顯示時長后自動隱藏。這種方式無需額外依賴,靈活且輕量,適用于快速提示信息。

需要注意以下幾點:


1. 確保正確配置 navigatorKey

  • Toast 功能依賴于 navigatorKey 來獲取 OverlayState,因此必須在 MaterialApp 中綁定 navigatorKey

    dart復制

    MaterialApp(navigatorKey: Toast.navigatorKey,...
    );
  • 如果未綁定 navigatorKeyToast.show 方法會打印錯誤信息,并且無法顯示 Toast。


2. 避免重復顯示 Toast

  • 當用戶快速多次點擊按鈕時,可能會導致多個 Toast 同時顯示。可以通過以下方式解決:

    • 在顯示 Toast 時設置一個標志位,避免重復調用。

    • 或者在顯示新 Toast 時,先移除已存在的 Toast。


3. 確保 Toast 的上下文正確

  • Toast.show 方法通過 Overlay 顯示,因此必須在包含 MaterialApp 的上下文中調用。

  • 如果在 MaterialApp 之外調用 Toast.show,會導致 OverlayStatenull


4. 注意 Toast 的顯示時長

  • 默認情況下,Toast 的顯示時長為 2 秒(Duration(seconds: 2))。如果需要更長或更短的顯示時間,可以通過 duration 參數自定義:

    dart復制

    Toast.show("這是一條消息", duration: Duration(seconds: 3));
  • 如果顯示時長過短,用戶可能無法看清內容;如果過長,可能會影響用戶體驗。

三、簡單案例實現

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

2、創建一個 application 的 Flutter 項目

3、編寫代碼,進行簡單 Toast 功能實現

4、在 main 中添加測試 Toast? 的 代碼

5、連接設備,或者 web ,運行效果如下

四、關鍵代碼

1、toast.dart

import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';// 定義 Toast 的顯示位置枚舉
enum ToastPosition { top, center, bottom }class Toast {// 定義一個全局的 NavigatorState 鍵,用于獲取 OverlayStatestatic final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();// Toast 顯示方法static void show(String message, {ToastPosition position = ToastPosition.bottom, // 默認顯示在底部Duration duration = const Duration(seconds: 2), // 默認顯示時長為 2 秒}) {// 獲取當前的 OverlayStatefinal OverlayState? overlayState = navigatorKey.currentState?.overlay;// 如果 OverlayState 為空,說明未正確設置 MaterialApp 的 navigatorKeyif (overlayState == null) {print("OverlayState is null. Make sure to use MaterialApp with navigatorKey.");return;}// 創建一個 OverlayEntry,用于顯示 Toastfinal OverlayEntry overlayEntry = OverlayEntry(builder: (context) {// 根據 position 參數設置 Toast 的對齊方式return Align(alignment: position == ToastPosition.center? Alignment.center // 顯示在屏幕中央: position == ToastPosition.top? Alignment.topCenter // 顯示在頂部: Alignment.bottomCenter, // 顯示在底部child: Padding(padding: EdgeInsets.only(top: position == ToastPosition.top ? 20 : 0, // 距離頂部 20pxbottom: position == ToastPosition.bottom ? 20 : 0, // 距離底部 20px),child: Material(elevation: 4, // 添加陰影效果borderRadius: BorderRadius.circular(50), // 設置為半圓形狀child: Container(constraints: BoxConstraints(minWidth: 100, maxWidth: 300), // 限制 Toast 的寬度padding: EdgeInsets.all(16), // 內邊距decoration: BoxDecoration(color: Colors.black87, // 背景顏色borderRadius: BorderRadius.circular(50), // 設置為半圓形狀),child: Text(message, // 顯示的文本內容style: TextStyle(color: Colors.white, fontSize: 16), // 文本樣式textAlign: TextAlign.center, // 文本居中softWrap: true, // 自動換行maxLines: null, // 不限制行數),),),),);},);// 將 OverlayEntry 插入到 Overlay 中,顯示 ToastoverlayState.insert(overlayEntry);// 使用 SchedulerBinding 添加一個后幀回調SchedulerBinding.instance.addPostFrameCallback((_) {// 在指定的 duration 時間后移除 OverlayEntry,隱藏 ToastFuture.delayed(duration).then((_) {overlayEntry.remove();});});}
}

代碼說明:

  1. ToastPosition 枚舉:定義了 Toast 的顯示位置(頂部、中央、底部)。

  2. navigatorKey:用于獲取當前 MaterialAppNavigatorState,從而獲取 OverlayState

  3. show 方法

    • 接收 message 參數(顯示的文本)和可選參數(位置和顯示時長)。

    • 檢查 OverlayState 是否為空,確保 MaterialApp 已正確配置。

    • 創建 OverlayEntry 并根據位置參數設置對齊方式。

    • 使用 MaterialContainer 構造 Toast 的樣式,包括背景顏色、陰影、圓角和文本樣式。

    • OverlayEntry 插入到 Overlay 中,顯示 Toast。

    • 使用 SchedulerBindingFuture.delayed 在指定時長后移除 Toast。

2、main.dart

import 'package:flutter/material.dart';
import 'toast.dart'; // 導入封裝的 Toast 工具類,用于顯示自定義 Toastvoid main() {runApp(MyApp());
}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter Toast Demo', // 應用的標題navigatorKey: Toast.navigatorKey, // 將全局的 navigatorKey 綁定到 MaterialApphome: Scaffold( // 主頁面布局appBar: AppBar( // 應用欄title: Text('Flutter Toast Demo'), // 標題),body: Center( // 主體內容居中child: Column( // 垂直布局mainAxisAlignment: MainAxisAlignment.center, // 子組件垂直居中children: [ElevatedButton( // 按鈕,點擊后顯示頂部 ToastonPressed: () {Toast.show("這是一條頂部 Toast輔導費地方東方飯店", // 要顯示的文本position: ToastPosition.top, // 設置 Toast 顯示在頂部);},child: Text('顯示頂部 Toast'), // 按鈕文本),SizedBox(height: 20), // 間距ElevatedButton( // 按鈕,點擊后顯示中間 ToastonPressed: () {Toast.show("這是一條中間 Toast", // 要顯示的文本position: ToastPosition.center, // 設置 Toast 顯示在中間);},child: Text('顯示中間 Toast'), // 按鈕文本),SizedBox(height: 20), // 間距ElevatedButton( // 按鈕,點擊后顯示底部 ToastonPressed: () {Toast.show("這是一條底部 Toast", // 要顯示的文本position: ToastPosition.bottom, // 設置 Toast 顯示在底部);},child: Text('顯示底部 Toast'), // 按鈕文本),],),),),);}
}

代碼說明:

  1. 導入模塊

    • import 'toast.dart';:導入封裝好的 Toast 工具類,用于實現自定義 Toast 功能。

  2. MyApp

    • MaterialApp:Flutter 的根組件,用于配置主題和路由。

    • navigatorKey: Toast.navigatorKey:將 Toast 類中定義的全局 navigatorKey 綁定到 MaterialApp,以便通過 navigatorKey 獲取 OverlayState,這是顯示 Toast 的關鍵。

  3. Scaffold

    • Scaffold 是 Flutter 中用于構建頁面布局的基礎組件,包含 appBarbody

    • appBar:顯示頁面的標題。

    • body:頁面的主體內容,使用 CenterColumn 布局,將按鈕垂直居中。

  4. 按鈕功能

    • 每個按鈕通過 onPressed 回調調用 Toast.show 方法。

    • Toast.show 方法接收一個字符串(要顯示的文本)和一個可選參數 position(指定 Toast 的顯示位置:頂部、中間、底部)。

    • 示例中分別展示了如何調用頂部、中間和底部的 Toast。

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

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

相關文章

《OpenCV》——dlib(人臉應用實例)

文章目錄 dlib庫dlib庫——人臉應用實例——表情識別dlib庫——人臉應用實例——疲勞檢測 dlib庫 dlib庫的基礎用法介紹可以參考這篇文章&#xff1a;https://blog.csdn.net/lou0720/article/details/145968062?spm1011.2415.3001.5331&#xff0c;故此這篇文章只介紹dlib的人…

學習日記-250305

閱讀論文&#xff1a;Leveraging Pedagogical Theories to Understand Student Learning Process with Graph-based Reasonable Knowledge Tracing ps:代碼邏輯最后一點還沒理順&#xff0c;明天繼續 4.2 Knowledge Memory & Knowledge Tracing 代碼研究&#xff1a; 一般…

【AI大模型】DeepSeek + Kimi 高效制作PPT實戰詳解

目錄 一、前言 二、傳統 PPT 制作問題 2.1 傳統方式制作 PPT 2.2 AI 大模型輔助制作 PPT 2.3 適用場景對比分析 2.4 最佳實踐與推薦 三、DeepSeek Kimi 高效制作PPT操作實踐 3.1 Kimi 簡介 3.2 DeepSeek Kimi 制作PPT優勢 3.2.1 DeepSeek 優勢 3.2.2 Kimi 制作PPT優…

【ESP-ADF】在 VSCode 安裝 ESP-ADF 注意事項

1.檢查網絡 如果您在中國大陸安裝&#xff0c;請使用魔法上網&#xff0c;避免無法 clone ESP-ADF 倉庫。 2.VSCode 安裝 ESP-ADF 在 VSCode 左側活動欄選擇 ESP-IDF:explorer&#xff0c;展開 advanced 并點擊 Install ESP-ADF 然后會出現選擇 ESP-ADF 安裝目錄。 如果出現…

關于2023新版PyCharm的使用

考慮到大家AI編程的需要&#xff0c;建議大家安裝新版Python解釋器和新版PyCharm&#xff0c;下載地址都可以官網進行&#xff1a; Python&#xff1a;Download Python | Python.org&#xff08;可以根據需要自行選擇&#xff0c;建議選擇3.11&#xff0c;保持交流版本一致&am…

輕松部署 Stable Diffusion WebUI 并實現局域網共享訪問:解決 Conda Python 版本不為 3.10.6 的難題

這篇博文主要為大家講解關于sd webui的部署問題&#xff0c;大家有什么不懂的可以隨時問我&#xff0c;如果沒有及時回復&#xff0c;可聯系&#xff1a;1198965922 如果后續大家需要了解怎么用代碼調用部署好的webui的接口&#xff0c;可以在評論區留言哦&#xff0c;博主可以…

Leetcode 103: 二叉樹的鋸齒形層序遍歷

Leetcode 103: 二叉樹的鋸齒形層序遍歷 問題描述&#xff1a; 給定一個二叉樹&#xff0c;返回其節點值的鋸齒形層序遍歷&#xff08;即第一層從左到右&#xff0c;第二層從右到左&#xff0c;第三層從左到右&#xff0c;依此類推&#xff09;。 適合面試的解法&#xff1a;廣…

Linux中的進程間通信的方式及其使用場景

在 Linux 系統中&#xff0c;進程間通信&#xff08;Inter-Process Communication, IPC&#xff09;是指不同進程之間傳遞數據、共享信息的機制。Linux 提供了多種進程間通信的方式&#xff0c;每種方式都有不同的特點和使用場景。以下是常見的幾種進程間通信方式及其應用場景&…

springBoot集成emqx 實現mqtt消息的發送訂閱

介紹 我們可以想象這么一個場景&#xff0c;我們java應用想要采集到電表a的每小時的用電信息&#xff0c;我們怎么拿到電表的數據&#xff1f;一般我們會想 直接 java 后臺發送請求給電表&#xff0c;然后讓電表返回數據就可以了&#xff0c;事實上&#xff0c;我們java應用發…

vue Table 表格自適應窗口高度,表頭固定

當表格內縱向內容過多時&#xff0c;可選擇固定表頭。 代碼很簡單&#xff0c;其實就是在table 里面定一個 height 屬性即可。 <template><el-table:data"tableData"height"250"borderstyle"width: 100%"><el-table-columnprop…

多線程-JUC

簡介 juc&#xff0c;java.util.concurrent包的簡稱&#xff0c;java1.5時引入。juc中提供了一系列的工具&#xff0c;可以更好地支持高并發任務 juc中提供的工具 可重入鎖 ReentrantLock 可重入鎖&#xff1a;ReentrantLock&#xff0c;可重入是指當一個線程獲取到鎖之后&…

【每日學點HarmonyOS Next知識】Web Header更新、狀態變量嵌套問題、自定義彈窗、stack圓角、Flex換行問題

【每日學點HarmonyOS Next知識】Web Header更新、狀態變量嵌套問題、自定義彈窗、stack圓角、Flex換行問題 1、HarmonyOS 有關webview Header無法更新的問題&#xff1f; 業務A頁面 打開 webivew B頁面&#xff0c;第一次打開帶了header請求&#xff0c;然后退出webview B頁面…

【ATXServer2】Android無法正確顯示手機屏幕

文章目錄 現象原因分析與解決排查手機內部minicap 解決minicap問題查看移動端Android SDK版本查看minicap支持版本單次方案多次方案 最后問題-如何支持Android SDK 32 現象 原因分析與解決 由于atxserver2在與Android動終端的鏈接過程中使用了agent&#xff1a;atxserver2-and…

【前端跨域】CORS:跨域資源共享的機制與實現

在現代Web開發中&#xff0c;跨域資源共享&#xff08;Cross-Origin Resource Sharing&#xff0c;簡稱CORS&#xff09;是一種非常重要的技術&#xff0c;用于解決瀏覽器跨域請求的限制 CORS允許服務器明確指定哪些外部源可以訪問其資源&#xff0c;從而在保證安全的前提下實…

【設計模式】單例模式|餓漢模式|懶漢模式|指令重排序

目錄 1.什么是單例模式&#xff1f; 2.如何保證單例&#xff1f; 3.兩種寫法 &#xff08;1&#xff09;餓漢模式&#xff08;早創建&#xff09; &#xff08;2&#xff09;懶漢模式&#xff08;緩執行&#xff0c;可能不執行&#xff09; 4.應用場景 &#x1f525;5.多…

RocketMQ順序消費機制

RocketMQ的順序消費機制通過生產端和消費端的協同設計實現&#xff0c;其核心在于局部順序性&#xff0c;即保證同一隊列&#xff08;MessageQueue&#xff09;內的消息嚴格按發送順序消費。以下是詳細機制解析及關鍵源碼實現&#xff1a; 一、順序消費的核心機制 1. 生產端路…

【JavaEE】-- 多線程(初階)4

文章目錄 8.多線程案例8.1 單例模式8.1.1 餓漢模式8.1.2 懶漢模式 8.2 阻塞隊列8.2.1 什么是阻塞隊列8.2.2 生產者消費者模型8.2.3 標準庫中的阻塞隊列8.2.4 阻塞隊列的應用場景8.2.4.1 消息隊列 8.2.5 異步操作8.2.5 自定義實現阻塞隊列8.2.6 阻塞隊列--生產者消費者模型 8.3 …

【C++設計模式】第四篇:建造者模式(Builder)

注意&#xff1a;復現代碼時&#xff0c;確保 VS2022 使用 C17/20 標準以支持現代特性。 分步驟構造復雜對象&#xff0c;實現靈活裝配 1. 模式定義與用途 核心目標&#xff1a;將復雜對象的構建過程分離&#xff0c;使得同樣的構建步驟可以創建不同的表示形式。 常見場景&am…

vuex中的state是響應式的嗎?

在 Vue.js 中&#xff0c;Vuex 的 state 是響應式的。這意味著當你更改 state 中的數據時&#xff0c;依賴于這些數據的 Vue 組件會自動更新。這是通過 Vue 的響應式系統實現的&#xff0c;該系統使用了 ES6 的 Proxy 對象來監聽數據的變化。 當你在 Vuex 中定義了一個 state …

若依框架中的崗位與角色詳解

若依框架中的崗位與角色詳解 一、核心概念與定位 崗位&#xff08;Post&#xff09; 業務職能導向&#xff1a;崗位是用戶在組織架構中的職務標識&#xff08;如“開發人員”“項目經理”&#xff09;&#xff0c;用于描述工作職責而非直接控制權限。崗位與部門關聯&#xff…