有个场景就是 ,我有一组组的数据,需要异步处理,但是又不是很及时响应,需要另外一个主动推消息过来告诉我,这个异步执行完成了有结果了。这个时候我们可以使用Completer 来完成。
说明:
当我们点击了 “开始任务” , 就会进入一个循环里面执行 打印事件,而我们需要这个打印事件真正完成的时候才会继续发送下一条数据去打印,这个时候假设在等待中,我们跟着点击一下模拟器的回调 “执行下一个” , 这个时候会发现 才会执行循环里面的下个发送事件, 这样可以让事件在有序的等待回调
Widget 代码
Container(
child: Column(
children: [
GestureDetector(
child: Text('开始任务'),
onTap: () {
PrintManager.doActionTask();
},
),
SizedBox(
height: 50,
),
GestureDetector(
child: Text('执行下一个'),
onTap: () {
PrintManager.callBack();
},
)
],
),
)
打印管理类
import 'dart:async';
class PrintManager {
Completer<String> _completer;
static PrintManager manager;
static initData() {
if (manager == null) {
manager = PrintManager();
}
}
//开始做任务
static Future<void> doActionTask() async {
for(int i = 0; i < 10; i++) {
print('进入循环第${i} 个');
await manager.printe();
}
}
//打印任务
Future<String> printe() async {
_completer = Completer<String>();
await sendMessage();
print('在等待中');
return _completer.future;
}
//发送消息数据进行打印
void sendMessage() async {
await Future(() {
print('耗时任务,挂起来, 发送消息了 async');
});
}
//回调
static void callBack() {
if (manager._completer?.isCompleted == false) {
print('啊 我回调了, 可以执行下一个了');
manager._completer.complete('xixi');
}
}
}
打印日志
flutter: 进入循环第0 个
flutter: 耗时任务,挂起来, 发送消息了 async
flutter: 在等待中
flutter: 啊 我回调了, 可以执行下一个了
flutter: 进入循环第1 个
flutter: 耗时任务,挂起来, 发送消息了 async
flutter: 在等待中
flutter: 啊 我回调了, 可以执行下一个了
flutter: 进入循环第2 个
flutter: 耗时任务,挂起来, 发送消息了 async
flutter: 在等待中
flutter: 啊 我回调了, 可以执行下一个了
flutter: 进入循环第3 个
flutter: 耗时任务,挂起来, 发送消息了 async
flutter: 在等待中
flutter: 啊 我回调了, 可以执行下一个了
flutter: 进入循环第4 个
flutter: 耗时任务,挂起来, 发送消息了 async
flutter: 在等待中
flutter: 啊 我回调了, 可以执行下一个了
flutter: 进入循环第5 个
flutter: 耗时任务,挂起来, 发送消息了 async
flutter: 在等待中
flutter: 啊 我回调了, 可以执行下一个了
flutter: 进入循环第6 个
flutter: 耗时任务,挂起来, 发送消息了 async
flutter: 在等待中
flutter: 啊 我回调了, 可以执行下一个了
flutter: 进入循环第7 个
flutter: 耗时任务,挂起来, 发送消息了 async
flutter: 在等待中
flutter: 啊 我回调了, 可以执行下一个了
flutter: 进入循环第8 个
flutter: 耗时任务,挂起来, 发送消息了 async
flutter: 在等待中
flutter: 啊 我回调了, 可以执行下一个了
flutter: 进入循环第9 个
flutter: 耗时任务,挂起来, 发送消息了 async
flutter: 在等待中
flutter: 啊 我回调了, 可以执行下一个了