Flutter學習筆記(35)--通知Notification

来源:https://www.cnblogs.com/upwgh/archive/2020/06/19/13162281.html
-Advertisement-
Play Games

通知的NotificationListener和我們之前寫的事件的Listener一樣,都是功能性的組件,而且也都是從子節點順著widget樹向上冒泡,不同的是,事件的Listener不可以被終止,但是通知的NotificationListener是可以被終止的。 是否終止根據Notificatio... ...


如需轉載,請註明出處:Flutter學習筆記(35)--通知Notification

通知的NotificationListener和我們之前寫的事件的Listener一樣,都是功能性的組件,而且也都是從子節點順著widget樹向上冒泡,不同的是,事件的Listener不可以被終止,但是通知的NotificationListener是可以被終止的。

是否終止根據NotificationListener的返回值來決定。

說一下我個人的理解:

通知Notification的發送是通過disPatch進行分發的,就好像Android裡面的事件分發,當NotificationListener監聽到了通知事件,這時候會走到其onNotification回調中,根據回調中的返回值類型(true還是false)來決定是否還繼續向父親節點發送通知。

返回true就是繼續分發,返回false就是終止分發,返回false就意味著上層節點的NotificationListener就不會接收到通知事件了。

舉個例子就是:

兩層NotificationListener嵌套,子節點的NotificationListener返回true,那麼父親節點的NotificationListener可以接收到通知事件,反之如果返回false,那麼父親節點的NotificationListener就不會接收到通知事件了。

下麵看一下demo示例:

demo就是簡單的發送通知,監聽到通知事件後改變text的內容。

1.創建一個事件通知類,要繼承Notification,它其實就是一個數據載體,在裡面定義通知數據的類型和內容。

import 'package:flutter/material.dart';

class MyNotification extends Notification{
  String notificationStr;

  MyNotification(this.notificationStr);
}

2.NotificationListener的使用和通知事件的分發

import 'package:flutter/material.dart';
import 'package:study_app/util/MyNotification.dart';

class NotificationDemo extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _NotificationDemoState();
  }
}

class _NotificationDemoState extends State {
  String _notificationData = 'default_data';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'NotificationDemo',
      home: new Scaffold(
          appBar: AppBar(
            title: Text('NotificationDemo'),
          ),
          body: NotificationListener<MyNotification>(
            onNotification: (notification) {
              setState(() {
                _notificationData = notification.notificationStr;
              });
              return true;
            },
            child: Column(
              children: <Widget>[
                Text(_notificationData),
                Builder(
                  builder: (context) {
                    return Container(
                      width: double.infinity,
                      child: RaisedButton(
                          child: Text('發送通知'),
                          onPressed: () {
                            MyNotification('notification_data')
                                .dispatch(context);
                          }),
                    );
                  },
                )
              ],
            ),
          )),
    );
  }
}

在看書的時候,作者強調了一種錯誤的寫法,如下圖註釋的部分:

原因是通知在分發的時候,需要一個context參數,這個參數指的是Notification監聽的子widget的context,如果按照註釋部分的寫法的話,context是根widget的,這樣會導致監聽不到子widget了。

所以需要我們通過Builder構建出我們子widget的context,這裡需要特別註意一下。

最後看一下效果截圖:

   

以上!有任何疑問歡迎留言!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 視圖的創建 、 --create view 視圖名 as 查詢語句--註意:視圖查詢中的欄位不能重名-- 視圖中的數據是‘假數據’,真實數據在數據表中,如果數據表中被修改了,則視圖中的數據也受影響-- 使用視圖和使用數據表方法一樣。視圖也可排序、分組、設置條件,還可以嵌套 create view e ...
  • 查詢 select * from 表名 --簡單查詢 查詢指定列 select 指定的列 from 表名select id,name,sex,age from Employee--註:select age*14 from Employee --簡單查詢--查詢前幾行信息 select top 幾行 ...
  • Oracle中獲取字元串下標、截取字元串 獲取下標: SELECT INSTR('AAA-BBB-CCC-DDD', '-', 1, 1) as 字元位置 FROM dual 截取字元串: SELECT SUBSTR('AAA-BBB-CCC-DDD', 1, 3) as 截取字元串 FROM DU ...
  • 本文更新於2019-06-19,使用MySQL 5.7,操作系統為Deepin 15.4。 數值類型 整數類型 type[(m)] [UNSIGNED] [ZEROFILL] [AUTO_INCREMENT] 類型 位元組 最小值 最大值 TINYINT 1 有符號-128,無符號0 有符號127,無 ...
  • --1.使用SQL語句創建名稱為SHWLW-News-DB的資料庫。(3分)create database SHWLW_News_DBuse SHWLW_News_DB--2.按數據字典要求創建新聞分類表結構。(5分)新聞分類(NewsType)表結構:create table NewsType( ...
  • --數據表約束:通過制定一些規則,使存入資料庫的數據規範、正確、完整。 --非空約束 該欄位不能為空 關鍵字:not null --唯一約束 該欄位的值在本表不能重覆,可以為null,但只能有一次。關鍵字 unique --預設約束 給該欄位一個預設值,空的時候按預設值來,不空的按你輸入的來 def ...
  • --create database 資料庫名create database Unit2_1712A --使用資料庫【打開資料庫】--use 資料庫名use Unit2_1712A --刪除資料庫--drop database 資料庫名drop database Unit2_1712A --備份資料庫 ...
  • 摘要 本文的目的不是介紹 iOS 中各種鎖如何使用,一方面筆者沒有大量的實戰經驗,另一方面這樣的文章相當多,比如 iOS中保證線程安全的幾種方式與性能對比、iOS 常見知識點(三):Lock。本文也不會詳細介紹鎖的具體實現原理,這會涉及到太多相關知識,筆者不敢誤人子弟。 本文要做的就是簡單的分析 i ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...