异步 Stream

flutter 异步方式
  • Future
  • Completer
  • Async/await
  • Stream

Completer

Completer 控制 Future 和async await一样

  Future testAsync()  {
      Completer comp = Completer();
      Future.delayed(Duration(seconds: 2),(){
        print("2");
        comp.complete();
      });
      print("1");
      return comp.future;
  }

  testAsync().then((value){
      print("3");
  });

执行结果 1,2,3

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 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;
  }

你可能感兴趣的:(异步 Stream)