在 Flutter 裡用 camera,看似簡單,其實是個多層次的世界。
要讓影像處理順暢不卡,非得搞清楚幾件事。
一、await 不等於背景執行
await 只是語法糖,讓非同步程式看起來「像同步」。
但它仍在主執行緒裡運行,只是暫時讓出控制權。
如果背後的工作太重,畫面還是會頓。
二、Isolate、compute、spawn 的差別
Flutter 沒有真正的多執行緒。
要在背景處理資料,得靠 Isolate。
- compute()
- Flutter 內建的簡易背景工具。
- 適合「一次性任務」,例如單張影像轉換。 任務結束後自動銷毀。
- Isolate.spawn()
- 可以建立「長駐的背景執行緒」。
- 用 SendPort、ReceivePort 跟主程式保持溝通。
- 適合連續性任務,例如影像串流、推論、錄影壓縮。
簡單說:
await 是語法糖,
compute 是臨時工,
spawn 才是常駐員。
三、Channel 與 FFI 的界線
Flutter 與原生世界溝通有兩種方式:
- Platform Channel
- Flutter ↔ Android / iOS 的橋樑。
- 執行於主執行緒。
- 適合拍照、權限、系統呼叫等操作。
- FFI(Foreign Function Interface)
- 直接呼叫原生 C/C++ 函式庫。
- 可在背景 Isolate 執行。
- 適合高運算任務:影像處理、AI 推論、FFT、加密等。
一句話:
Channel 負責「通話」,
FFI 負責「運算」。
四、assets 只能在主執行緒載入
rootBundle.load()、AssetImage 都屬於 Flutter engine 綁定資源。
背景 Isolate 無法直接操作。
正確方式:
在主執行緒載入檔案。 轉成 Uint8List。 傳進背景執行緒處理。
五、真正的背景執行要靠 FFI
背景 Isolate 無法使用 Channel、也不能載入 assets。
若要做長時間、重運算的工作,
FFI 是唯一穩定的方式。
這樣才能完全脫離主執行緒,不影響畫面。
六、結語
Flutter 的非同步世界其實很單純。
async / await 是流程控制,
Isolate 是平行運算,
Channel 是橋樑,
FFI 才能真正「分身」。
理解這幾層,Camera 的畫面就能穩、背景的運算也能快。
真正流暢的 Flutter,就從這裡開始。









