文章目录
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相同
特点
- 和数据流向无关,可以实现任意流向的数据共享
- ValueListenableBuilder的拆分颗粒度尽可能的细,提高性能
- 修改值的时候,要操作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表示向上传递
特点
- NotificationListener以冒泡的方式监听Notification的组件,冒泡的方式就是向上传递,从子组件向父组件传递。
- 系统定义了很多Notification,比如SizeChangedLayoutNotification、ScrollNotification、KeepAliveNotification、OverscrollIndicatorNotification、DraggableScrollableNotification等。
- 可以自定义Notification,使用dispatch方法发送通知。
- 适用于嵌套深的子组件向父组件传递消息
使用(自定义)
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;