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

Flutter中Future.wait使用异常:重复发送子列表问题求助

问题分析与修复方案

问题根源

  1. getValue() 返回值不匹配需求:Future.wait() 要求传入 Iterable<Future> 类型参数,但你的 getValue() 无返回值(默认返回void),这会导致 Future.wait() 执行异常,直接打乱循环逻辑。
  2. 重复订阅流引发重复触发:每次循环调用 getValue() 都会重新订阅 _characteristic42?.value 流,旧订阅未被取消,多订阅会重复接收通知,最终导致同一个子列表被反复发送。
  3. Future.wait() 用法完全错误:你需要的是等待单次异步确认后再执行下一次发送,而 listen 是持续订阅流的操作,完全不适合用 Future.wait() 来等待。

修复代码示例

先重构方法,让它返回一个Future来等待确认信号,而非无意义的持续订阅:

Future<void> waitForConfirmation() async {
  final completer = Completer<void>();
  StreamSubscription? subscription;

  subscription = _characteristic42?.value.listen((notification) {
    print("Notification Value : $notification");
    // 这里可添加你的确认逻辑,比如收到特定通知后结束等待
    completer.complete();
    subscription?.cancel(); // 取消订阅避免内存泄漏
  });

  return completer.future;
}

再修改循环内的逻辑,替换错误的Future.wait(getValue()):

if (notification[0] == 170 && notification[1] == 204) {
  await Future.forEach(chun, (ch) async {
    await Future.delayed(const Duration(seconds: 4));
    await c.write(ch, withoutResponse: true);
    await c.read();
    // 等待确认信号,而非错误使用Future.wait
    await waitForConfirmation();
  });
}

额外注意事项

  • 若无需每次发送都重新订阅流,建议初始化时仅订阅一次,用变量保存订阅对象,避免重复订阅。
  • 页面销毁或不再需要时,务必取消所有流订阅,防止内存泄漏。
  • 如果c.read()的返回值已能作为确认依据,可直接用该返回值判断,无需额外监听通知,逻辑会更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:30:40