flutter 异步方式
- Future
- Async/await
- Stream
Stream
stream 是一个事件流的,当状态变化,就会通知监听回调; 对于UI上的 StreamBuilder一般比较好的是 可以通过异步绘制,当stream流数据变化,会自动重新绘制UI
对 stream 改为同步,使用await无效,
因为只能通过监听异步回调才能得到结果
所以需要先通过stream 监听保存数据,
再使用 延迟 sleep 等待几秒再去重新查询状态
// ZSBlue.instance.state 是 stream流
if (ZSBlue.instance.state == null) {
// 还未设置 初始化 延迟一会
await Future.delayed(Duration(milliseconds: 10));
}
if (ZSBlue.instance.state == BluetoothState.unauthorized ) {
//前往设置授权", "“发得快”连接打印设备");
return false;
};
if (ZSBlue.instance.state == null) {
// 等待结束还未初始化完
// 提示 “蓝牙异常 请稍后重试”
return false;
}
Timer 和 Future.delayed 区别
两个都可以时间延迟 执行部分
Future.delayed 可能会报错
如果在延迟结束的时候 函数已经 return 掉
Timer 可以取消,因此尽量使用 Timer来延迟执行
/*
* 这是一个 主动轮询查询 状态的, 在超时后结束轮询
* 超时认为状态获取失败
*/
static Future<ZSBluePrinterState> readStatues() async {
bool endFun = false;
// 如果使用Future.delayed 轮训提前结束,延迟后面到时间后会报错
// 因为当前函数已经 return了
// Future.delayed(Duration(milliseconds: 500),(){
Timer t = Timer(Duration(milliseconds: 500), () {
if (endFun == false) {
print(" ----------- 读取状态 超时了 -------- ");
setStateByBytes([]);
}
});
while (zsPrinteStateReading == true) {
await Future.delayed(Duration(milliseconds: 1));
}
t.cancel();
endFun = true;
return printerState;
}
网友评论