flutter StreamController,ValueListenableBuilder,NotificationListener

本文介绍了Flutter中FutureBuilder、StreamBuilder、ValueListenableBuilder及NotificationListener的使用方法与特点。详细解析了它们在异步数据更新、持续数据监听、按需重建及自定义通知的应用场景。
摘要由CSDN通过智能技术生成

FutureBuilder (异步数据更新)

只能更新一次

多个请求组合使用

_future = Future.wait([AAA(), BBB()]);

在这里插入图片描述

StreamBuilder (异步数据更新)

持续数据更新(比如倒计时就可以使用它)

构造函数

在这里插入图片描述

特点
  • 接收多个异步操作的结果class StreamBuilder<T> extends StreamBuilderBase<T, AsyncSnapshot<T>>{}
  • 单订阅:StreamController<String> _streamController = StreamController();只支持1对1,支持一个订阅者
  • 多订阅: StreamController<String> _streamController1 = StreamController.broadcast();,可以1对多,支持多个订阅者
使用
初始化:
final StreamController<String> _streamController = StreamController();
使用:
 StreamBuilder<String>(
            stream: _streamController.stream,
            initialData: initStr,
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                return ...
              } else {
              ...
              }
数据改变:
streamController.add(xxx);
销毁:
_streamController.close();

ValueListenableBuilder(按需rebuild)

构造函数

在这里插入图片描述

  • valueListenable,类型是ValueListenable,一个可监听的数据源
  • builder,数据源发生变化通知时,会重新调用builder,重新build子组件树
  • child,child会作为builder的第三个参数传递给builder,通过这种方式实组件缓存,和AnimatedBuilder的第三个参数child相同
特点
  1. 和数据流向无关,可以实现任意流向的数据共享
  2. ValueListenableBuilder的拆分颗粒度尽可能的细,提高性能
  3. 修改值的时候,要操作ValueNotifier对象去修改才能收到通知
使用
 ValueNotifier<int> _num = ValueNotifier<int>(0);

 ValueListenableBuilder<int>(valueListenable: _num, builder: (context,value,child) {
              return Text(value.toString());
            },child: Text('呵呵哈哈哈或'),),
//数据改变就会收到通知
widget.num.value++;

NotificationListener

构造函数

在这里插入图片描述

  • onNotification方法需要bool返回值,返回true表示不向上传递,返回false表示向上传递
特点
  1. NotificationListener以冒泡的方式监听Notification的组件,冒泡的方式就是向上传递,从子组件向父组件传递
  2. 系统定义了很多Notification,比如SizeChangedLayoutNotification、ScrollNotification、KeepAliveNotification、OverscrollIndicatorNotification、DraggableScrollableNotification等。
  3. 可以自定义Notification,使用dispatch方法发送通知。
  4. 适用于嵌套深的子组件向父组件传递消息
使用(自定义)
class CustomNotification extends Notification {
  final String value;

  CustomNotification(this.value);
}

NotificationListener<CustomNotification>(
  child: CupertinoButton(
      child: Text('CustomNotification'),
      onPressed: () {
        CustomNotification('bbb').dispatch(context);
      }),
  onNotification: (CustomNotification notification) {
    print(notification.value);
    return true;
  },
),

引用:
Flutter实战·第二版
Stream

待学习:
CustomPaint;
CustomSingleChildLayout;
CustomMultiChildLayout;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值