Flutter学习笔记(35)--通知Notification
如需转载,请注明出处: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的更多相关文章
- Flutter学习笔记(9)--组件Widget
如需转载,请注明出处:Flutter学习笔记(9)--组件Widget 在Flutter中,所有的显示都是Widget,Widget是一切的基础,我们可以通过修改数据,再用setState设置数据(调 ...
- Flutter学习笔记(14)--StatefulWidget简单使用
如需转载,请注明出处:Flutter学习笔记(14)--StatefulWidget简单使用 今天上班没那么忙,突然想起来我好像没StatefulWidget(有状态组件)的demo,闲来无事,写一个 ...
- Flutter学习笔记(16)--Scaffold脚手架、AppBar组件、BottomNavigationBar组件
如需转载,请注明出处:Flutter学习笔记(15)--MaterialApp应用组件及routes路由详解 今天的内容是Scaffold脚手架.AppBar组件.BottomNavigationBa ...
- Flutter学习笔记(25)--ListView实现上拉刷新下拉加载
如需转载,请注明出处:Flutter学习笔记(25)--ListView实现上拉刷新下拉加载 前面我们有写过ListView的使用:Flutter学习笔记(12)--列表组件,当列表的数据非常多时,需 ...
- Flutter学习笔记(27)--数据共享(InheritedWidget)
如需转载,请注明出处:Flutter学习笔记(27)--数据共享(InheritedWidget) InheritedWidget是Flutter中非常重要的一个功能型组件,它提供了一种数据在widg ...
- Flutter学习笔记(29)--Flutter如何与native进行通信
如需转载,请注明出处:Flutter学习笔记(29)--Flutter如何与native进行通信 前言:在我们开发Flutter项目的时候,难免会遇到需要调用native api或者是其他的情况,这时 ...
- Flutter学习笔记(3)--Dart变量与基本数据类型
一.变量 在Dart里面,变量的声明使用var.Object或Dynamic关键字,如下所示: var name = ‘张三’: 在Dart语言里一切皆为对象,所以如果没有将变量初始化,那么它的默认值 ...
- Flutter学习笔记(4)--Dart函数
如需转载,请注明出处:Flutter学习笔记(4)--Dart函数 Dart是一个面向对象的语言,所以函数也是对象,函数属于Function对象,函数可以像参数一样传递给其他函数,这样便于做回调处理: ...
- Flutter学习笔记(5)--Dart运算符
如需转载,请注明出处:Flutter学习笔记(5)--Dart运算符 先给出一个Dart运算符表,接下来在逐个解释和使用.如下: 描述 ...
随机推荐
- 如何为Form表单的多个提交按钮指定不同的Action地址?
这是我很久以前看到的一个技巧,但我忘记在哪里了,当时遇到这样的需求,做了笔记,现在整理成文章分享出来,因为我感觉这个小技巧还是挺有用的,这种应用场景也算比较常见,比如一个表单有"保存&quo ...
- uni-app运行到浏览器跨域H5页面的跨域问题解决方案
官方文档对跨域的解决方案推荐: https://ask.dcloud.net.cn/article/35267 更方便的解决方案 项目根目录直接创建一个vue.config.js文件,并在里面配置代理 ...
- Go 包管理中的常见问题
随处可见的GO111MODULE=on 在GitHub上,经常看到不少项目的readme里都有这么一句: ✗ GO111MODULE=on go get golang.org/x/tools/gopl ...
- 记录我在Docker 中一步一步搭建Mysql 数据库存开发环境
准备在docker下来搭建mysql开发环境玩玩,当作学习笔记.搭建环境是:win10 企业版,docker desktop 19.03.8,mysql 5.7,Windows PowerShell ...
- 【转】动态规划:最长递增子序列Longest Increasing Subsequence
转自:https://www.cnblogs.com/coffy/p/5878915.html 设f(i)表示L中以ai为末元素的最长递增子序列的长度.则有如下的递推方程: 这个递推方程的意思是,在求 ...
- Alpha冲刺 —— 个人总结
这几日Alpha冲刺的个人进展汇总,收获满满,我成长了. 我们的团队博客链接,团队作业第五次--Alpha冲刺 4.30 今日进展 改进数据库:字段命名重新规范,在record表中添加confirme ...
- Rocket - tilelink - toBools
https://mp.weixin.qq.com/s/UGMH8EoaVcFkkQW-l4HLWg 分析toBools在Intellij中显示为红色的问题. 1. 问题 在TLA ...
- jchdl - GSL实例 - Counter
https://mp.weixin.qq.com/s/BjQtQE8DfaKP1XwcTiCwVg 摘自康华光<电子技术基础 · 数字部分>(第五版) 参考链接 https: ...
- Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
790. 多米诺和托米诺平铺 有两种形状的瓷砖:一种是 2x1 的多米诺形,另一种是形如 "L" 的托米诺形.两种形状都可以旋转. XX <- 多米诺 XX <- &q ...
- (Java实现) 最大团问题 部落卫队
首先介绍下最大团问题: 问题描述:给一个无向图G=(V,E) ,V是顶点集合,E是边集合.然后在这顶点集合中选取几个顶点,这几 个顶点任意两个之间都有边在E中.求最多可以选取的顶点个数.这几个顶点就构 ...