如需转载,请注明出处: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,这里需要特别注意一下。

最后看一下效果截图:

   

以上!有任何疑问欢迎留言!

Flutter学习笔记(35)--通知Notification的更多相关文章

  1. Flutter学习笔记(9)--组件Widget

    如需转载,请注明出处:Flutter学习笔记(9)--组件Widget 在Flutter中,所有的显示都是Widget,Widget是一切的基础,我们可以通过修改数据,再用setState设置数据(调 ...

  2. Flutter学习笔记(14)--StatefulWidget简单使用

    如需转载,请注明出处:Flutter学习笔记(14)--StatefulWidget简单使用 今天上班没那么忙,突然想起来我好像没StatefulWidget(有状态组件)的demo,闲来无事,写一个 ...

  3. Flutter学习笔记(16)--Scaffold脚手架、AppBar组件、BottomNavigationBar组件

    如需转载,请注明出处:Flutter学习笔记(15)--MaterialApp应用组件及routes路由详解 今天的内容是Scaffold脚手架.AppBar组件.BottomNavigationBa ...

  4. Flutter学习笔记(25)--ListView实现上拉刷新下拉加载

    如需转载,请注明出处:Flutter学习笔记(25)--ListView实现上拉刷新下拉加载 前面我们有写过ListView的使用:Flutter学习笔记(12)--列表组件,当列表的数据非常多时,需 ...

  5. Flutter学习笔记(27)--数据共享(InheritedWidget)

    如需转载,请注明出处:Flutter学习笔记(27)--数据共享(InheritedWidget) InheritedWidget是Flutter中非常重要的一个功能型组件,它提供了一种数据在widg ...

  6. Flutter学习笔记(29)--Flutter如何与native进行通信

    如需转载,请注明出处:Flutter学习笔记(29)--Flutter如何与native进行通信 前言:在我们开发Flutter项目的时候,难免会遇到需要调用native api或者是其他的情况,这时 ...

  7. Flutter学习笔记(3)--Dart变量与基本数据类型

    一.变量 在Dart里面,变量的声明使用var.Object或Dynamic关键字,如下所示: var name = ‘张三’: 在Dart语言里一切皆为对象,所以如果没有将变量初始化,那么它的默认值 ...

  8. Flutter学习笔记(4)--Dart函数

    如需转载,请注明出处:Flutter学习笔记(4)--Dart函数 Dart是一个面向对象的语言,所以函数也是对象,函数属于Function对象,函数可以像参数一样传递给其他函数,这样便于做回调处理: ...

  9. Flutter学习笔记(5)--Dart运算符

    如需转载,请注明出处:Flutter学习笔记(5)--Dart运算符 先给出一个Dart运算符表,接下来在逐个解释和使用.如下:                            描述       ...

随机推荐

  1. vue端口号被占用

    今天在启动一个Vue项目的时候,遇到了一个问题. 得知是Vue项目端口号占用的问题.   解决方法: 换一个端口号. 在调用  npm run dev 的时候,实际上是在调用根目录下的 package ...

  2. Meta标签基本使用

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><t ...

  3. 项目readme文件目录生成工具 treer

    生成目录的工具呢有tree和treer,但是tree不知道怎么忽略node_modules文件夹, 而treer就简单了,下面就是基本的命令了 其中-i是指忽略xxx, -e是指导出 安装 npm i ...

  4. 应用4:利用Filter限制用户浏览权限

    1. 使用 Filter 完成一个简单的权限模型: 1). 需求: ①. 管理权限 > 查看某人的权限 > 修改某人的权限 ②. 对访问进行权限控制: 有权限则可以访问, 否则提示: 没有 ...

  5. 【汇总】 为园友写的皮肤制作工具 awescnb

    Awescnb, awesome cnblog. 简介 可能许多初来乍到的新手会被博客园经典的风格劝退,或者您是一个老园友,需要为您的博客定制一些功能(例如宣传公众号,文章目录.或者插入几个捐助二维码 ...

  6. 02 . Python之数据类型

    Python入门之数据类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间.基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数 ...

  7. Java实现 LeetCode 792 自定义字符串排序(暴力)

    792. 匹配子序列的单词数 给定字符串 S 和单词字典 words, 求 words[i] 中是 S 的子序列的单词个数. 示例: 输入: S = "abcde" words = ...

  8. Java 蓝桥杯 算法训练(VIP) 最大体积

    最大体积 问题描述 每个物品有一定的体积(废话),不同的物品组合,装入背包会战用一定的总体积. 假如每个物品有无限件可用,那么有些体积是永远也装不出来的. 为了尽量装满背包,附中的OIER想要研究一下 ...

  9. Java 第十一届 蓝桥杯 省模拟赛 无向连通图最少包含多少条边

    无向连通图最少包含多少条边 题目 问题描述 一个包含有2019个结点的无向连通图,最少包含多少条边? 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一个整数,在提交答案时只填 ...

  10. Java实现 LeetCode 462 最少移动次数使数组元素相等 II

    462. 最少移动次数使数组元素相等 II 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最多为10000. 例如: 输 ...