Flutter中如何用类似iOS Semaphore的方式调整代码执行顺序
在Flutter(Dart)中实现同步等待异步任务(对应iOS Semaphore的需求)
你的原代码里Timer.run属于异步任务,会被放到事件队列中,等当前同步代码执行完毕后才会触发,所以打印顺序是1→3→2。要实现1→2→3的顺序,核心是等待异步任务完成后再执行后续代码,Dart里有几种原生实现方式,不需要额外依赖:
方式一:用Completer手动控制Future完成
void _test() async { print(1); final completer = Completer<void>(); Timer.run(() { print(2); completer.complete(); // 标记异步任务完成 }); await completer.future; // 等待异步任务完成后,再执行后续代码 print(3); }
Completer就像一个手动触发的信号,调用complete()后,await completer.future的位置会恢复执行,完美对应iOS中Semaphore的等待/触发逻辑。
方式二:直接包装成Future并await
如果不需要手动控制完成时机,可以直接把Timer的逻辑包装成Future,用await等待执行完毕:
void _test() async { print(1); await Future(() { print(2); }); print(3); }
Future()会把任务加入事件队列,await会暂停当前函数直到任务执行结束,效果和方式一一致,代码更简洁。
方式三:使用Semaphore包(通用信号量场景)
如果你的场景更复杂(比如需要控制并发数),可以引入package:async包中的Semaphore,用法和iOS的Semaphore类似:
- 先在
pubspec.yaml中添加依赖:async: ^2.11.0 - 代码实现:
import 'package:async/async.dart'; void _test() async { print(1); final semaphore = Semaphore(1); // 初始化信号量,许可数为1 await semaphore.acquire(); // 获取许可 Timer.run(() { print(2); semaphore.release(); // 释放许可 }); await semaphore.acquire(); // 等待许可被释放 semaphore.release(); print(3); }
不过对于这个简单场景来说,前两种原生方式已经足够,不需要额外引入包。
内容的提问来源于stack exchange,提问作者无夜之星辰
相关产品推荐
相关产品推荐

