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

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类似:

  1. 先在pubspec.yaml中添加依赖:async: ^2.11.0
  2. 代码实现:
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,提问作者无夜之星辰

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:39:19