Flutter中Future.wait使用异常:重复发送子列表问题求助
问题分析与修复方案
问题根源
getValue()返回值不匹配需求:Future.wait()要求传入Iterable<Future>类型参数,但你的getValue()无返回值(默认返回void),这会导致Future.wait()执行异常,直接打乱循环逻辑。- 重复订阅流引发重复触发:每次循环调用
getValue()都会重新订阅_characteristic42?.value流,旧订阅未被取消,多订阅会重复接收通知,最终导致同一个子列表被反复发送。 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
相关产品推荐
相关产品推荐

