Flutter笔记--通知

devtools/2024/10/4 3:18:32/

       这一节回顾一下Flutter中的Notification,Notification(通知)是Flutter中一个重要的机制,在widget树中,每一个节点都可以分发通知,通知会沿着当前节点向上传递,所有父节点都可以通过NotificationListener来监听通知,通过它可以实现跨组件的事件传递,使应用变得更加灵活。

主要步骤包括:

1 创建NotificationListener:在需要监听通知的Widget的build方法中,创建NotificationListener实例。
2 设置onNotification回调函数:NotificationListener需要一个onNotification回调函数,用于处理接收到的通知。在回调函数中,可以编写逻辑来处理不同类型的通知。
3 指定子Widget:将需要被监听通知的Widget作为NotificationListener的子Widget。

栗子:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';class NotificationTest extends StatefulWidget {@overrideState<StatefulWidget> createState() {return _NotificationTest();}
}class _NotificationTest extends State<NotificationTest> {int _progress = 0;@overrideWidget build(BuildContext context) {return Scaffold(body: NotificationListener<ScrollNotification>(onNotification: (ScrollNotification notification) {if(notification is ScrollStartNotification) {print('开始滚动...');} else if(notification is ScrollUpdateNotification) {final currentPixel = notification.metrics.pixels;final totalPixel = notification.metrics.maxScrollExtent;double progress = currentPixel / totalPixel;setState(() {_progress = (progress * 100).toInt();print('滚动..._progress:$_progress');});print('正在滚动: ${currentPixel} - ${totalPixel}');} else if(notification is ScrollEndNotification) {print('结束滚动...');}//  返回false表示不阻止事件继续向上冒泡  return false;},child: Stack(alignment: Alignment.bottomRight,children: [ListView.builder(itemCount: 100,itemExtent: 60,itemBuilder: (BuildContext context,int index) {return ListTile(title: Text("Item $index"),);})],)),);}}

通知冒泡:

1 通知的发起:在Flutter的Widget树中,任何节点都可以分发通知。这通常通过调用Notification.dispatch(context)方法实现,其中context是当前节点的上下文信息。
dispatch方法会调用context.visitAncestorElements(visitAncestor),这个方法会向上遍历父元素,并对每个父元素执行visitAncestor回调。

2 通知的传递:通知从子节点开始,沿着Widget树向上传递,在传递过程中,每个父节点都有机会通过NotificationListener组件来监听这些通知。

3. 通知的中止:通知冒泡可以中止。如果在NotificationListener的onNotification回调中返回true,则表示当前节点已经处理了通知,并决定不再向上传递。如果返回false,则通知会继续向上传递,直到遇到下一个NotificationListener或到达Widget树的顶部。


http://www.ppmy.cn/devtools/120555.html

相关文章

【Linux】进程周边之优先级

目录 一、优先级 1.为什么要有进程优先级&#xff1f; 2.什么是进程优先级&#xff1f; 3.优先级的初始设定 3.1 PRI 和 NI 3.2如何修改优先级&#xff1f;&#xff08;sudo/root&#xff09; 3.2.1 概念&#xff1a; 3.2.2 如何查看进程的优先级&#xff1f; 3.3.3 或…

开源大模型 vs闭源大模型

在人工智能&#xff08;AI&#xff09;领域&#xff0c;如何评价一个AI模型的优劣和发展前景&#xff0c;是一个复杂而又广泛讨论的问题。在这个过程中&#xff0c;"开源"和"闭源"的发展路径成为绕不开的两条道路。开源模式以共享知识和技术进步为宗旨&…

解决MySQL报Incorrect datetime value错误

目录 一、前言二、问题分析三、解决方法 一、前言 欢迎大家来到权权的博客~欢迎大家对我的博客进行指导&#xff0c;有什么不对的地方&#xff0c;我会及时改进哦~ 博客主页链接点这里–>&#xff1a;权权的博客主页链接 二、问题分析 这个错误通常出现在尝试将一个不…

第十章 MySQL主从复制搭建Docker版

目录 1.新建主服务器容器示例3307 2. 进入/mydata/mysql-master/conf目录下创建my.cnf配置 3.修改完配置后重启master实例 4.进入mysql-master容器 5.master容器实例内创建数据同步的用户 6.新建从服务器容器实例3308 7.进入/mydata/mysql-slave/conf目录下新建my.c…

SQL高可用优化-优化SQL中distinct和Where条件对索引字段进行非空检查语句

最近做一个需求&#xff0c;关于SQL高可用优化&#xff0c;需要优化项目中的SQL&#xff0c;提升查询效率。 SQL高可用优化 一、优化SQL包含distinct场景二、优化SQL中Where条件中索引字段是否为NULL三、代码验证1. NodeMapper2. NodeService3. NodeController4.数据库数据5.项…

JSON 教程

JSON 教程 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> …

Axios入门使用

文章目录 Axios入门使用一、引言二、Axios的安装与配置1、安装Axios2、创建Axios实例 三、发送HTTP请求1、GET请求2、POST请求3、并发请求 四、配置和拦截器1、配置默认值2、拦截器 五、错误处理和取消请求1、错误处理2、取消请求 四、总结 Axios入门使用 一、引言 随着前端技…

JVM(HotSpot):堆空间(Heap)以及常用相关工具介绍

文章目录 一、内存结构图二、堆的定义三、堆内存溢出四、堆内存排查工具 一、内存结构图 二、堆的定义 1、通过new关键字创建的对象&#xff0c;都会放到堆空间中。 2、它是线程共享的&#xff0c;堆中的对象都要考虑线程安全问题。 那有同学肯定会问&#xff0c;方法内通过n…