點燈坊

失くすものさえない今が強くなるチャンスよ

Hot Reload、Hot Restart 與 Full Restart

Sam Xiao's Avatar 2024-11-15

Flutter 為了加速開發,提供了 Hot Reload、Hot Restart 與 Full Restart 三種模式,各有各的使用時機及場景。

Version

Flutter 3.24

Hot Reload

hot01

  • Android Studio 預設在 存檔 就會執行 Hot Reload
  • 工作原理
    • 重新編譯 widget tree 但不重新執行 app 且維持原本 state
    • 重新執行 build(),但不執行 main.dartinitState()
  • 執行速度:最快
  • 使用時機
    • 切版
    • main.dartinitState() 的邏輯改變

Hot Restart

hot02

Run -> Flutter Hot Restart

  • 工作原理
    • 重新編譯 widget tree 並重新執行 app 與清空 state
    • 重新執行 build(),且會執行 main.dartinitState()
  • 執行速度
    • 很快
    • 但比 Hot Reload 稍慢
  • 使用時機
    • main.dartinitState() 的邏輯改變
    • initState() 呼叫 API 時
    • 改變字型 時 (因為要執行 main.dart)
    • 部分 Dart 語法未支援 (Enum、Generic …改變)

Full Restart

hot03

  • 第一次要執行 Full Restart
  • 先 Stop 後 Run 即會執行 Full Restart
  • 工作原理
    • 重新使用 Dart、Kotlin 或 Swift 完整編譯
    • 也會執行 Gradle 部分
  • 執行速度
    • 最慢,吃 CPU 多核心效能
    • 且 iOS 又比 Android 慢
  • 使用時機:
    • 加入 新圖片字型package
    • 有修改 pubspec.yaml
    • 修改 native code (Kotilin、Swift)
    • Hot Reload 與 Hot Reset 都失效時

Hot Reload All Devices

hot04

  • 自行將 Hot Reload all devices 加到 Toolbar
  • 一次 Hot Reload 所有裝置

Hot Reload All Devices 並非一開始就能用,必須先在各裝置執行過 Full Restart 後才可使用

Hot Restart All Devices

hot05

  • 自行將 Hot Restart all devices 加到 Toolbar
  • 一次 Hot Restart 所有裝置

Hot Restart All Devices 並非一開始就能用,必須先在各裝置執行過 Full Restart 後才可使用

Full Restart All Devices

  • Android Studio 並不支援 Full Restart All Devices,必須每個裝置自行 Full Restart

Conclusion

  • Web 只有 Hot Reload,無論修改 HTML、CSS 或 JavaScript,只要一存檔就會執行 Hot Reload
  • Flutter 除了 Hot Reload 外,還另外支援 Hot Restart,雖然速度較 Hot Reload 慢一點,但還是遠比 Full Restart 快很多
  • 大部分狀況下 Hot Reload 已經很夠用,只有少數狀況必須使用 Hot Restart,若加入新的圖片、字型、package 則一定要使用 Full Restart

Reference

Samuel Getachew, Hot Reload vs. Hot Restart in Flutter: When to Use Each for Efficient Development
Flutter, Hot Reload