同步生成器
- 使用sync*,返回的是Iterable对象。
- yield会返回moveNext为true,并等待 moveNext 指令。
- 调用getSyncGenerator立即返回Iterable对象。
- 调用moveNext方法时getSyncGenerator才开始执行。
异步生成器
- 使用async*,返回的是Stream对象。
- yield不用暂停,数据以流的方式一次性推送,通过StreamSubscription进行控制。
- 调用getAsyncGenerator立即返回Stream,只有执行了listen,函数才会开始执行。
- listen返回一个StreamSubscription 对象进行流监听控制。
- 可以使用StreamSubscription对象对数据流进行控制。
ex:
generator.dart
import 'dart:async';
main(){
//同步生成器
var it = getSyncGenerator(5).iterator;
while (it.moveNext()) {
print(it.current);
}
print('-----------------------------------------------------');
//异步生成器
StreamSubscription subscription = getAsyncGenerator(5).listen(null);
subscription.onData((value) {
print(value);
if (value >= 2) {
subscription.pause(); //可以使用StreamSubscription对象对数据流进行控制
}
});
}
//同步生成器: 使用sync*,返回的是Iterable对象
Iterable<int> getSyncGenerator(int n) sync* {
print('start');
int k = 0;
while (k < n) {
yield k++;
}
print('end');
}
//异步生成器: 使用async*,返回的是Stream对象
Stream<int> getAsyncGenerator(int n) async* {
print('start');
int k = 0;
while (k < n) {
//yield不用暂停,数据以流的方式一次性推送,通过StreamSubscription进行控制
yield k++;
}
print('end');
}
输出:
D:\flutter\bin\cache\dart-sdk\bin\dart.exe --enable-asserts --enable-vm-service:48288 D:\Code\Flutter\FlutterHello\flutter_app\lib\generator.dart
lib/generator.dart: Warning: Interpreting this as package URI, 'package:flutterapp/generator.dart'.
Observatory listening on http://127.0.0.1:48288/_sso-K1e278=/
start
0
1
2
3
4
end
-----------------------------------------------------
start
0
1
2
Process finished with exit code 0