class StreamDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('StreamDemo'), elevation: 0.0,),
body: StreamDemoHome(),
);
}
}
class StreamDemoHome extends StatefulWidget {
@override
_StreamDemoHomeState createState() => _StreamDemoHomeState();
}
class _StreamDemoHomeState extends State<StreamDemoHome> {
StreamSubscription _streamDemoSubscription;
// StreamController可以控制、管理stream
StreamController<String> _streamDemo;
StreamSink _sinkDemo;
@override
void dispose() {
_streamDemo.close();
super.dispose();
}
@override
void initState() {
super.initState();
print('Create a stream.');
// 创建stream
// Stream<String> _streamDemo = Stream.fromFuture(fetchData());
_streamDemo = StreamController<String>();
_sinkDemo = _streamDemo.sink;
print('Start listening on a stream');
// 使用stream上的数据需要监听这个stream,提供了几个事件的处理方法,比如有数据的时候,发生错误的时候,完成的时候
// listen的返回值是StreamSubscription类型,使用它可以暂停、恢复、取消监听
// _streamDemoSubscription = _streamDemo.listen(onData, onError: onError, onDone: onDone);
// 使用streamController监听
// 使用StreamBuilder时,这里就不需要监听了
// _streamDemoSubscription = _streamDemo.stream.listen(onData, onError: onError, onDone: onDone);
print('Initialize completed.');
}
void onData(String data) {
print('$data');
}
void onError(error) {
print('Error: $error');
}
void onDone() {
print('Done');
}
void _pauseStream() {
print('停止监听');
_streamDemoSubscription.pause();
}
void _resumeStream() {
print('恢复监听');
_streamDemoSubscription.resume();
}
void _cancelStream() {
print('取消监听');
_streamDemoSubscription.cancel();
}
void _addDataToStream() async {
print('给stream添加数据');
String data = await fetchData();
// _streamDemo.add(data);
// 使用sink给stream添加数据
_sinkDemo.add(data);
}
// 5秒后在stream上出现一个字符串
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 5));
return 'Hello World!';
}
@override
Widget build(BuildContext context) {
return Container(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
// 使用StreamBuilder可以根据stream上的数据去构建小部件,stream上的数据发生变化后会重新构建小部件
StreamBuilder(
stream: _streamDemo.stream,
initialData: '...', // 设置初始值
builder: (context, snapshot) {
return Text('${snapshot.data}');
},
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
FlatButton(onPressed: _addDataToStream, child: Text('添加')),
FlatButton(onPressed: _pauseStream, child: Text('停止')),
FlatButton(onPressed: _resumeStream, child: Text('继续')),
FlatButton(onPressed: _cancelStream, child: Text('取消')),
],
),
],
),
),
);
}
}
flutter之stream
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 单一侦听和多重侦听 使用StreamController ()只能设置一个侦听函数StreamController...
- 作为系列文章的第十一篇,本篇将非常全面带你了解 Flutter 中最关键的设计之一,深入原理帮助你理解 Strea...
- 1.前言 在Dart库中,有两种实现异步编程的方式(Future和Stream),使用它们只需要在代码中引入dar...
- Eg:将Stream集合中的语句进行单词拆分,然后去重Stream testStream= Stream.of("...