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

最后看一下效果截图:

   

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

最新文章

  1. 总结javascript中的全局变量和局部变量的区别以及声明函数和调用函数的区别
  2. WebFrom 的js日期控件
  3. sdut 2125串结构练习--字符串匹配【两种KMP算法】
  4. 使用 sp_executesql
  5. gitphp日期乱码解决方案
  6. Database name和SID
  7. 十个最值得阅读学习的C开源项目代码
  8. python爬虫获取图片
  9. AD域自定义属性《完整》
  10. Java并发编程(多线程)中的相关概念
  11. linux-Centos 7下tftp-server服务的安装与配置
  12. 异常 java.net.ConnectException: Connection refused: no further information
  13. 商城项目,java返回json数据,报错406
  14. Object C学习笔记6-如何在Windows环境搭建Object C开发环境
  15. [Git] An efficient GIT workflow for mid/long term projects
  16. vim列编辑模式快捷键
  17. docker-compose部署zk集群、kafka集群以及kafka-manager,及其遇到的问题和解决
  18. C# Json 序列化和反序列化 工具类 Newtonsoft.Json.dll
  19. python学习笔记2---函数
  20. 前端javaScript经典面试题

热门文章

  1. React Router简单Demo
  2. jchdl - RTL实例 - MOS6502 ALU
  3. ASP.NET实现一个在线音乐统计网站(歌手,音乐,角色……增删改查)
  4. Java 第十一届 蓝桥杯 省模拟赛 螺旋矩阵
  5. Java实现 LeetCode 669 修剪二叉搜索树(遍历树)
  6. 使用Python爬取网页的相关内容(图片,文字,链接等等)
  7. 第五届蓝桥杯JavaA组省赛真题
  8. Charles(青花瓷/花瓶)的基本使用
  9. 循序渐进VUE+Element 前端应用开发(7)--- 介绍一些常规的JS处理函数
  10. (十)HTTP.sys远程代码执行