背景
Termux + Flutter + dart ffi で .so リロード対応し Android C/C++ + GUI アプリ開発を効率化するメモ
https://qiita.com/syoyo/items/21ba3174fe5a668f2960
などで, 特定のファイルで変更があったときに Flutter に hot reload 命令を送りたい.
(VSCode では, .dart ファイルが変更されたときだけ reload)
方法
flutter run --machine
で Flutter アプリを起動します.
これにより, stdin/stdout で JSON-RPC で通信できます.
appId
は event message(stdout への出力)で取得できます.
[{"method":"app.restart", "id": 0, "params" : { "appId" : "e0c12cae-e4f3-47a9-8447-2b250bcc4af9", "fullRestart": true}}]
というメッセージを stdin(or /proc/<pid>/fd/0
)に書き込むと hot reload できるはずです.
id
は JSON-RPC の id なので, 任意の番号を指定します.
赤い画面になったら再度 flutter run が必要
赤い画面の致命的なエラーがでたら, app.restart
命令は fullRestart
を true にしてもアプリは再起動しません. 再度 flutter run --machine
する必要があります.
flutter attach は使えない
たとえば VSCode で実行しておいて, 外部プログラムでリロードの命令を送りたいですよね.
しかし, flutter attach では, app.restart
命令が使えません. JSON-RPC で命令を送ると NoSuchMethodError が帰ってきます.
したがって, flutter run
する以外に方法がありません.
VSCode と連携したいが...
VSCode の dart extension では, pid や appId を出してくれません.
pid と appId がわかれば, 外部から /proc/<pid>/fd/0
で命令を送れるはずですが... なんらかのオプションで情報だしてくれるかもですが, ソースコードの改変が必要になるかもです.
現状使いにくい...
flutter run では, stdin/stdout で入力と出力を受け付けます. http などはないっぽそうです.
(--overvatory-port
は, デバッグやプロファイリング用で, app.restart
メソッドは使えない)
python などスクリプトを使って, popen などと組み合わせないとめんどいです.
(Linux/macOS だったら socat でソケットと stdin/stdout を繋ぐというてもあるかも?)
いずれにせよ処理を自動化するには stdout をパースしたりとめんどいで, 使いにくいです.
なんとか VSCode と連携したい...
ファイル変更があったときに vscode のコマンドを実行できる
あたりと連携するか, VSCode Dart extension を拡張することになるでしょうか...
dart.previewHotReloadOnSaveWatcher
何かしらダミーの .dart ファイルを作っておき, Dart flutter extension v3.7.0 以降で dart.previewHotReloadOnSaveWatcher
を true にする方法が考えられます.
このフラッグが true ですと, (VSCode の?)file watcher で変更を検知しますので, VSCode の外で .dart ファイルを編集した場合でも hot reload が実行されます!
(2019 年 11 月 15 日とフラッグ追加は最近ですね)
最近の VSCode ですと File -> Preferences -> Setting -> Extensions で Dart: Preview Hot Reload On Save Watcher
に GUI でチェックをいれるだけなので楽ですね.
参考
VSCode dart extension(Flutter の機能は dart plugin に入っていて, Flutter repo は実質空です).
TODO
-
VSCode dart extension を改造して, pid, appId を抜き出したり, 特定のフォルダ or file の watch ができるようにする.
- .so など, 非 .dart ファイルが変更されたときは, カスタムの shell コマンドを実行できるようにする