Flutter Platform Channel 的 await 陷阱:为什么加与不加相差 100ms?

Flutter Platform Channel 的 await 陷阱:为什么加与不加相差 100ms?

现象

调用同一个 Android 方法,仅因是否加 await,耗时差距巨大:

dart

arduino 复制代码
// ❌ 耗时约 100ms
await platform.invokeMethod('updateText', text);

// ✅ 耗时不足 1ms
platform.invokeMethod('updateText', text);

Android 端即使是空实现,await 版本依然要等 100ms。这 100ms 耗费在哪里了?

原因:同步等待的是完整往返,而非方法执行

await 的完整流程

text

复制代码
Flutter → 序列化 → 跨进程传输 → Android 执行 → 序列化结果 → 跨进程返回 → Flutter
  ↑                                                                          ↑
  调用                                                                    恢复执行
  |←------------------------------------------------------ 等待 ~100ms ------------------------------------------------------→|

await 等待的是从发起到收到回复的整个往返过程,包含:

  • 参数序列化
  • 跨进程 Binder 传输
  • 线程切换(Flutter UI 线程 → Android 主线程)
  • 方法执行(实际业务逻辑)
  • 返回值序列化
  • 跨进程回传
  • 反序列化结果

其中 方法执行只占很小一部分(可能不到 1ms),其余都是通信开销。

不带 await 的流程

text

复制代码
Flutter → 序列化 → 跨进程传输 → Android 执行
  ↑
  立即返回(不等待任何结果)
  |←--- < 1ms ---→|

不等待时,Flutter 只负责把消息发出去,不等回复,因此几乎无阻塞。

为什么 100ms 是常态?

  • Binder 跨进程通信:Flutter 与 Android 运行在不同进程,通信依赖 Binder,每次往返有固定开销
  • 线程调度:涉及多次线程切换
  • 序列化/反序列化StandardMessageCodec 需要编码解码
  • Flutter 引擎消息队列:消息排队与处理需要时间

这些开销叠加,使得一次完整的 MethodChannel 往返稳定在 50--100ms 区间。

什么时候该用 await

场景 是否用 await 原因
需要返回值 ✅ 必须用 不等待拿不到结果
需要确认操作完成 ✅ 建议用 保证后续逻辑顺序
需要错误处理 ✅ 建议用 try-catch 需要等待结果
UI 更新 ❌ 不用 不需要确认,发完即走
日志/统计上报 ❌ 不用 不关心结果
预加载/缓存 ❌ 不用 后台执行即可

实践建议

对于 UI 更新这类不需要返回值的操作:

dart

arduino 复制代码
// 直接调用,不等待
void updateText(String text) {
  AndroidviewApi.updateText(text);
}

如需处理异常,用 catchError

dart

scss 复制代码
AndroidviewApi.updateText(text).catchError((e) {
  // 处理错误
});

如需在完成后执行某些操作,用 then

dart

scss 复制代码
AndroidviewApi.updateText(text).then((_) {
  // 更新完成后的操作
});

总结

await 加与不加的本质区别是:同步等待完整往返 vs 异步发送即返回

100ms 不是业务代码慢,而是 Platform Channel 通信的固有往返延迟。理解这一点,就能在正确的场景做出正确的选择------不需要等待结果时,就不要 await

相关推荐
年小个大12 小时前
受 go-zero 启发,我给 Flutter 写了一套 CLI 脚手架
android·flutter·架构
GitLqr1 天前
Flutter 居然能直接跑在 Apple Watch 上了?玩转 flutter-watchos
flutter·全栈·apple watch
你听得到111 天前
排查 App 问题:别只盯着报错,把前后发生的事情串起来
android·前端·flutter
天空之城--1 天前
近一周Android Flutter行业动态与实用参考
android·flutter
GitLqr2 天前
玩转 Flutter 项目依赖:从 pubspec.yaml 到实战包管理
flutter·面试·全栈
程序员老刘2 天前
Qwen 3.8 max干了20分钟没干完,免费模型3分17秒搞定,问题出在哪?
flutter·ai编程
飞凌嵌入式2 天前
告别多端重复开发:Buildroot+Flutter实现全平台UI风格统一
flutter·ui
FungLeo2 天前
Flutter 带 TTL 的多级缓存设计:内存+磁盘+网络三层实战
网络·flutter·缓存·性能优化
FungLeo2 天前
Flutter 可复用公共组件库设计与落地:AppDialog/BottomSheet 等实战
flutter
Fungleo1069973 天前
Flutter/Android Release 包连不上网?AndroidManifest INTERNET 权限排查实录
flutter