美文网首页
异步 Stream

异步 Stream

作者: 暖羊羊_d603 | 来源:发表于2020-12-07 20:23 被阅读0次
    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;
      }
    
    

    相关文章

      网友评论

          本文标题:异步 Stream

          本文链接:https://www.haomeiwen.com/subject/wocxiktx.html