Flutter 為了加速開發,提供了 Hot Reload、Hot Restart 與 Full Restart 三種模式,各有各的使用時機及場景。
Version
Flutter 3.24
Hot Reload
- Android Studio 預設在
存檔
就會執行 Hot Reload 工作原理
:- 重新編譯 widget tree 但不重新執行 app 且維持原本 state
- 重新執行
build()
,但不執行main.dart
與initState()
執行速度
:最快使用時機
:- 切版
- 非
main.dart
與initState()
的邏輯改變
Hot Restart
Run -> Flutter Hot Restart
工作原理
:- 重新編譯 widget tree 並重新執行 app 與清空 state
- 重新執行
build()
,且會執行main.dart
與initState()
執行速度
:- 很快
- 但比 Hot Reload 稍慢
使用時機
:- 在
main.dart
或initState()
的邏輯改變 - 在
initState()
呼叫 API 時 改變字型
時 (因為要執行main.dart
)- 部分 Dart 語法未支援 (Enum、Generic …改變)
- 在
Full Restart
- 第一次要執行 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
- 自行將 Hot Reload all devices 加到 Toolbar
- 一次 Hot Reload 所有裝置
Hot Reload All Devices 並非一開始就能用,必須先在各裝置執行過 Full Restart 後才可使用
Hot Restart All Devices
- 自行將 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