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

如何解决flutter_blue的connect方法无法同步捕获TimeoutException问题

问题解答

1. 是否运行在不同Zone?

不是。connect方法和你的调用代码运行在同一个Zone,异常捕获失败的根因是官方自带的超时逻辑实现错误:
Timer的回调是独立调度的异步任务,回调内抛出的异常不会关联到connect方法返回的Future对象,只会进入当前Zone的未捕获异常处理流程,因此外层针对await connect()的try/catch完全无法捕获该异常。

2. 是否无法通过await调用同步判断超时?

依赖官方自带的timeout参数确实无法实现,该参数的实现完全不符合预期:
Timer触发时仅调用了disconnect和抛出未关联到Future的异常,但是源码中await state.firstWhere((s) => s == BluetoothDeviceState.connected)没有设置终止逻辑,如果设备始终无法进入已连接状态,该语句会无限挂起,导致整个connect方法永远不会返回。

修复方案

弃用connect方法自带的timeout参数,使用Dart标准库Future的原生timeout方法包装连接逻辑即可,示例代码如下:

try {
  // 不传入官方timeout参数,自行控制超时时间
  await device.connect(autoConnect: false).timeout(const Duration(seconds: 4));
} on TimeoutException catch (_) {
  // 捕获超时后主动断开清理状态
  await device.disconnect();
  print("连接超时");
} catch (e) {
  // 处理其他连接异常
  print("连接错误:$e");
}

内容的提问来源于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 20:15:00