Stream
是一个事件流,可以实现异步触发事件,可以做到不同代码块的事件通知,类似于EventBus
。与StreamBuilder
配合使用可以做到局部刷新。
该代码简单的对StreamBuild
进行演示,程序的效果是执行一个持续发射事件的流,不同的注释有不同的效果,可以切换代码进行尝试,本篇的重点是StreamBuild
和Stream
的简单使用。实际开发中直接使用Stream
的地方不多,但是很多相关的组件是用这个为基础的,有时候会涉及到Stream
的api,这里只是一个简单例子,作为入门了解的地方,可以在此基础上对更多的代码进行了解
///用来展示StreamBuild异步任务的代码演示
///FutureBuild用来处理单次的异步任务,该组件可以用来处理多次的异步任务,比如事件流
///对于详细的使用需要了解一下异步任务中的Stream事件流,这里只做简单的介绍
import 'dart:async';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Material App',
home: Scaffold(
appBar: AppBar(
title: Text('Material App Bar'),
),
body: StreamBuilder<int>(
initialData: -1,
stream: _counter() ,//返回值要和接收的类型一致
// stream: _counter ,//返回值要和接收的类型一致
// stream: _error(),//错误内容
builder: (BuildContext context, AsyncSnapshot<int> snapshot){//需要返回一个Widget
if(snapshot.hasError){
int error = snapshot.error;
print('YM------>发生错误:$error');
}
switch(snapshot.connectionState){
case ConnectionState.none:
print('YM------>事件为none');
break;
case ConnectionState.waiting:
print('YM------>事件在等待执行中');
break;
case ConnectionState.active://Stream流中,每次发送数据都会在这里执行
int value = snapshot.data;
print('YM------>事件在活动中:值为:$value');
break;
case ConnectionState.done:
print('YM------>事件结束');
break;
}
return Container();
},
),
),
);
}
// 使用Stream来处理
// _counter(){
// Duration interval = Duration(seconds: 1);
// Stream<int> stream = Stream.periodic(interval, (data) => data);//每隔一秒输出一个数字,这是一个无限的流
// stream = stream.take(10); //指定发送事件个数,这里注意,计数十次,第十次的话会结束,而不是像单纯的dart一样
// // stream = stream.takeWhile((element) => element<5);//如果值小于20的话就一直输出
// return stream;
// }
//发射错误内容
_error(){
return Stream<int>.error(-99);
}
//使用async*来处理,这个代码参考flutter/widgets/async.dart
//参考链接:https://cloud.tencent.com/developer/article/1633899
//参考链接:https://jelenaaa.medium.com/what-are-sync-async-yield-and-yield-in-dart-defe57d06381
Stream<int> _counter() async*{
await Future<void>.delayed(Duration(seconds: 1));//等1秒发射
yield 1;
await Future<void>.delayed(Duration(seconds: 1));//等1秒发射
yield 2;
await Future<void>.delayed(Duration(seconds: 1));//等1秒发射
yield 3;
//在最后一个yield后面需要延迟一会儿,否则值无法生成,yield其实也有生成器函数的意思
await Future<void>.delayed(Duration(seconds: 1));
}
//这是将一个自执行函数定义为一个变量,这个代码参考flutter/widgets/async.dart
// Stream<int> _counter = (() async* {
// await Future<void>.delayed(Duration(seconds: 1));
// yield 1;
// await Future<void>.delayed(Duration(seconds: 1));
// yield 2;
// //在最后一个yield后面需要延迟一会儿,否则值无法生成,yield其实也有生成器函数的意思
// await Future<void>.delayed(Duration(seconds: 1));
// })();
}