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,这里需要特别注意一下。
最后看一下效果截图:
以上!有任何疑问欢迎留言!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
2019-06-19 Android 遍历手机应用,跳转应用市场详情页面