用途:解决 Flutter 中主 isolate 被阻塞导致的掉帧问题。Dart 采用单线程事件循环,所有 Flutter 代码默认运行在主 isolate 上,阻塞它就会产生卡顿。
主要能力与决策依据:I/O 密集型任务(HTTP、数据库)用主 isolate 上的 async/await;CPU 密集型且耗时小于 16ms 也用 async/await;一次性重任务用 Isolate.run();需要持续后台处理则用 Isolate.spawn() 配合端口通信。
使用方式:卸载重计算时,先定位阻塞 UI 的 CPU 操作,把计算抽成顶层或静态函数,确保只接收一个参数(isolate 约束),调用 Isolate.run(() => myFunction(data)),再在主 isolate 上 await 结果。长驻 worker 则先在主 isolate 建 ReceivePort,用 Isolate.spawn(entryPoint, mainPort.sendPort) 启动,worker 内建自己的 ReceivePort 并把 SendPort 回传,保存该 SendPort 做双向通信,销毁时关闭端口并 kill isolate。
限制与反模式:不要在内存中共享可变状态,isolate 之间只能通过消息传递数据;不要在主 isolate 解析大 JSON(超过 1MB 会阻塞帧),应使用 Isolate.run;不要在 build 中内联创建 Future 交给 FutureBuilder,否则每次重建都会重新触发。
验证:用 DevTools 确认重计算期间无掉帧,worker isolate 不再需要时被销毁,flutter test 通过。完整代码示例见原文 examples。