Flutter中Future队列内任务无法全部执行完成问题排查求助
问题原因
- 核心问题是你的Future队列没有做异常处理:只要队列中某一个
job()异步任务抛出未捕获的异常,整个链式绑定的_future就会进入失败状态,后续所有通过then绑定的任务都会直接跳过执行,导致队列永久失效。你看到的编号1之后的任务不执行,就是编号1对应的job执行时抛出了未捕获异常。 - 你提到的profiler相关报错和队列问题无关,是iOS端调试时的偶发系统报错,不影响业务逻辑。
解决方案
给每个任务添加异常捕获逻辑,保证单个任务失败不会中断整个队列即可,修改后的队列代码如下:
int i = 0; class TouchlessAlarmScheduleQueue { Future _future = Future(() {}); addJob(String alarmId, Future<void> Function() job) { print('$i added'); int iCopy = i; _future = _future.then((_) async { print("$iCopy done"); try { await job(); } catch (e, stackTrace) { // 可自行打印异常信息做业务排查 print("任务$iCopy执行出错: $e\n$stackTrace"); } }); i++; } }
可选优化点
- 如果需要区分任务执行成功/失败的回调,可以给
addJob方法增加可选的成功、失败回调参数 - 如果需要支持取消队列任务,可以额外维护一个
_isCanceled标识,执行每个任务前先判断标识状态 - 对于高频点击场景,还可以额外加防抖逻辑,避免短时间内加入大量无意义的重复任务
内容的提问来源于stack exchange,提问作者Max Tromp
相关产品推荐
相关产品推荐

