You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中FlutterBlue的stream回调异常未触发onError该如何捕获

异常未被onError捕获的核心原因

Stream.listen 配置的 onError 回调仅能捕获Stream 自身主动发射的错误事件,你代码中抛出的异常来源于 onData 回调内部的异步操作 await device.connect()。由于你传入的 onData 是异步函数,函数内部未捕获的异常属于异步Future异常,不会冒泡到Stream的错误处理链路,因此你定义的onError始终不会触发。

解决方案

方案1:在异步onData内部通过try-catch捕获(推荐)

直接对可能抛出异常的异步操作做单独捕获,还可以针对连接失败的场景做专属业务处理,比如重试、给用户弹出连接失败提示等。
示例代码:

var stream = FlutterBlue.instance.scan();
var sub = stream.listen(
  (scanResult) async {
    if (scanResult.device.name == _beacon.id) {
      device = scanResult.device;
      try {
        await device.connect();
        // 连接成功后续逻辑
      } catch (e) {
        // 捕获connect方法抛出的所有异常
        print("连接失败:$e");
      }
    }
  },
  onError: (error) {
    // 此处仍可捕获扫描流程自身的错误,比如蓝牙未开启、扫描权限不足等
    print("扫描出错:$error");
  }
);

方案2:为onData异步函数返回的Future附加catchError

如果你需要统一捕获onData内部所有异步逻辑的未处理异常,可以直接给onData函数附加catchError回调:

var stream = FlutterBlue.instance.scan();
var sub = stream.listen(
  (scanResult) async {
    if (scanResult.device.name == _beacon.id) {
      device = scanResult.device;
      await device.connect();
    }
  }.catchError((e) {
    print("onData异步逻辑出错:$e");
  }),
  onError: (error) {
    print("扫描出错:$error");
  }
);

内容的提问来源于stack exchange,提问作者Scorb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:45:05