Flutter笔记--通知

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

主要步骤包括:

1 创建NotificationListener:在需要监听通知的Widget的build方法中,创建NotificationListener实例。

2 设置onNotification回调函数:NotificationListener需要一个onNotification回调函数,用于处理接收到的通知。在回调函数中,可以编写逻辑来处理不同类型的通知。

3 指定子Widget:将需要被监听通知的Widget作为NotificationListener的子Widget。

栗子:

Dart 复制代码
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class NotificationTest extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _NotificationTest();
  }
}

class _NotificationTest extends State<NotificationTest> {
  int _progress = 0;

  @override
  Widget 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组件来监听这些通知。

  1. 通知的中止:通知冒泡可以中止。如果在NotificationListener的onNotification回调中返回true,则表示当前节点已经处理了通知,并决定不再向上传递。如果返回false,则通知会继续向上传递,直到遇到下一个NotificationListener或到达Widget树的顶部。
相关推荐
zjeweler6 小时前
“网安+护网”终极300多问题面试笔记-3共3-综合题型(最多)
笔记·网络安全·面试·职场和发展·护网行动
里欧跑得慢6 小时前
Flutter 测试全攻略:从单元测试到集成测试的完整实践
前端·css·flutter·web
键盘鼓手苏苏11 小时前
Flutter 三方库 pip 的鸿蒙化适配指南 - 实现标准化的画中画(Picture-in-Picture)模式、支持视频悬浮窗与多任务并行交互
flutter·pip·harmonyos
左手厨刀右手茼蒿11 小时前
Flutter 组件 sheety_localization 的适配 鸿蒙Harmony 实战 - 驾驭在线协作式多语言管理、实现鸿蒙端动态词条下发与全球化敏捷发布方案
flutter·harmonyos·鸿蒙·openharmony·sheety_localization
Elaine33611 小时前
【软件测试系统学习笔记:从理论基础到接口实战】
软件测试·笔记·学习·接口测试
xuhaoyu_cpp_java11 小时前
Maven学习(二)
java·经验分享·笔记·学习·maven
见山是山-见水是水11 小时前
鸿蒙flutter第三方库适配 - 路由书签应用
flutter·华为·harmonyos
火柴就是我11 小时前
记录一些跨平台开发需要的鸿蒙知识
flutter·harmonyos
Tong Z11 小时前
Flutter中的三种通道
flutter
智者知已应修善业12 小时前
【51单片机4位数循环小数位移数值位移】2023-6-9
c++·经验分享·笔记·算法·51单片机