Flutter笔记--通知

鼠扑  金牌会员 | 2024-10-9 07:04:42 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 867|帖子 867|积分 2601

       这一节回顾一下Flutter中的Notification,Notification(通知)是Flutter中一个紧张的机制,在widget树中,每一个节点都可以分发通知,通知会沿着当前节点向上传递,全部父节点都可以通过NotificationListener来监听通知,通过它可以实现跨组件的事件传递,使应用变得更加灵活。
主要步骤包括:
1 创建NotificationListener:在必要监听通知的Widget的build方法中,创建NotificationListener实例。
2 设置onNotification回调函数:NotificationListener必要一个onNotification回调函数,用于处理吸收到的通知。在回调函数中,可以编写逻辑来处理不同类型的通知。
3 指定子Widget:将必要被监听通知的Widget作为NotificationListener的子Widget。
栗子:
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. class NotificationTest extends StatefulWidget {
  4.   @override
  5.   State<StatefulWidget> createState() {
  6.     return _NotificationTest();
  7.   }
  8. }
  9. class _NotificationTest extends State<NotificationTest> {
  10.   int _progress = 0;
  11.   @override
  12.   Widget build(BuildContext context) {
  13.     return Scaffold(body: NotificationListener<ScrollNotification>(
  14.         onNotification: (ScrollNotification notification) {
  15.           if(notification is ScrollStartNotification) {
  16.             print('开始滚动...');
  17.           } else if(notification is ScrollUpdateNotification) {
  18.             final currentPixel = notification.metrics.pixels;
  19.             final totalPixel = notification.metrics.maxScrollExtent;
  20.             double progress = currentPixel / totalPixel;
  21.             setState(() {
  22.               _progress = (progress * 100).toInt();
  23.               print('滚动..._progress:$_progress');
  24.             });
  25.             print('正在滚动: ${currentPixel} - ${totalPixel}');
  26.           } else if(notification is ScrollEndNotification) {
  27.             print('结束滚动...');
  28.           }
  29.            //  返回false表示不阻止事件继续向上冒泡  
  30.            return false;
  31.         },
  32.         child: Stack(
  33.           alignment: Alignment.bottomRight,
  34.           children: [
  35.             ListView.builder(
  36.                 itemCount: 100,
  37.                 itemExtent: 60,
  38.                 itemBuilder: (BuildContext context,int index) {
  39.                   return ListTile(title: Text("Item $index"),);
  40.                 })
  41.           ],
  42.         )),);
  43.   }
  44. }
复制代码
通知冒泡:
1 通知的发起:在Flutter的Widget树中,任何节点都可以分发通知。这通常通过调用Notification.dispatch(context)方法实现,其中context是当前节点的上下文信息。
dispatch方法会调用context.visitAncestorElements(visitAncestor),这个方法会向上遍历父元素,并对每个父元素执行visitAncestor回调。
2 通知的传递:通知从子节点开始,沿着Widget树向上传递,在传递过程中,每个父节点都有机会通过NotificationListener组件来监听这些通知。
3. 通知的中止:通知冒泡可以中止。如果在NotificationListener的onNotification回调中返回true,则表现当前节点已经处理了通知,并决定不再向上传递。如果返回false,则通知会继承向上传递,直到遇到下一个NotificationListener或到达Widget树的顶部。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

鼠扑

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表