前言
对于刚接触
Flutter
的同学来说,Stream
(流)是一个相对比较抽象,也相对比较难以理解的东西。准确的来说Stream
并不是Flutter
的特性,而是Dart
语言自身所带库。Stream
和Future
都位于dart:async
核心库,是Dart中异步操作的两大高手。所以不仅仅可以用于Flutter
,而是可以用于任何Dart
语言上的实现。在我们刚开始学习Flutter的时候基本都是使用
StatefulWidget
和setState((){})
来刷新界面的数据,当我熟练使用流之后就可以基本完全使用StatelessWidget
告别StatefulWidget
同样达到数据刷新效果。
Stream分类
流可以分为两类:
-
单订阅流(Single Subscription),这种流最多只能有一个监听器(listener)
-
多订阅流(Broadcast),这种流可以有多个监听器监听(listener)
Stream创建方式
-
Stream.fromFuture 接收一个Future对象作为参数
Stream<String>.fromFuture(getData()); Future<String> getData() async{ await Future.delayed(Duration(seconds: 5)); return "返回一个Future对象"; }
-
Stream.fromIterable 接收一个集合对象作为参数
Stream<String>.fromIterable(['A','B','C']);
-
Stream.fromFutures 接收一个Future集合对象作为参数
Stream<String>.fromFutures([getData()]);
-
Stream.periodic 接收一个 Duration对象作为参数
Duration interval = Duration(seconds: 1); Stream<int> stream = Stream<int>.periodic(interval);
操作方式及使用
使用Stream .periodic 方式创建一个Stream对象
用于创建一个周期发送事件的流,如下
///用于创建一个每隔一秒发送一次无限事件的流,并打印出值
void _stream() async{
Duration interval = Duration(seconds: 1);
Stream<int> stream = Stream.periodic(interval, (data) => data);
await for(int i in stream ){
print(i);
}
}
//(data){return data;} 上面的这句是用来回来值,如果省略这句,打印的值都为null
.
-
Stream.take(int count)
上面创建了一个无限每隔一秒发送一次事件的流,如果我们想指定只发送10个事件则,用take。下面就只会打印出0-9
void _stream() async{ Duration interval = Duration(seconds: 1); Stream<int> stream = Stream.periodic(interval, (data) => data); stream = stream.take(10); //指定发送事件个数 await for(int i in stream ){ print(i); } }
-
Stream.takeWhile
上面这种方式我们是只制定了发送事件的个数,如果我们也不知道发送多少个事件,我们可以从返回的结果上做一个返回值的限制,上面结果也可以用以下方式实现
void _stream() async { Duration interval = Duration(seconds: 1); Stream<int> str