開発効率が上がるFlutter x Android StudioのTips集

最近Flutterを触り始めて「これは開発効率高まるな/高まるかもしれない」と思ったことがいくつもあったのでまとめてみます。他にも見つかり次第、追記しようかと思います。

# Hot Reload

ファイル保存時（もしくはHot Reloadボタンをクリックしたとき）に変更内容がデバッグ中のアプリに反映されます。わざわざビルドし直さなくていいのはかなり楽です。
![hotReload.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/1b74c34a-31bc-0846-9ed2-37ab76f5c717.gif)

Hot Reloadボタンはこちらにあります。
![スクリーンショット 2020-06-07 10.54.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/cfa5b820-eb30-153b-d726-40bfcca46380.png)

# Flutter Inspector

Flutter Inspectorの中のSelect Widget Modeの紹介をします。
これを有効にした状態でデバッグ中のアプリのWidgetをタップすると、Widgetツリー上でハイライトされたり、該当コードが表示されたりします。
有効にしたい場合はInspector内の `Enable Select Widget Mode` ボタンをタップします。
![Enable Select Widget Mode](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/a4d3fbec-e321-c6e5-6297-6c48e109eb47.png)
動きは以下の通りです。
![inspector.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/f86c9f37-2685-ad0a-3748-007546b932ea.gif)

これがあれば「この画面ってコード上でどのScreenだっけ？」「このWidgetのレイアウトコードは？」といったことが簡単にわかります。

# Flutter Outline

資料があまりなくてよくわかってないのですが、Flutter Outlineの中の、おそらくHot UIと呼ばれているものについて紹介します。Hot UIは以下の場所から有効にします。
![Hot UI](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/6cb3e604-6702-1e58-1ead-50f55034338f.png)

Flutter Outlineの下に編集可能なプロパティ一覧が現れ、編集するとHot Reloadされて変更が反映されるとともに、コードも変更してくれます。固定値でも、変数でも大丈夫なようです。
![HotUI.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/4c3ec48e-0487-0c45-d633-7678f692bf05.gif)

この他、例えば色の変更などもできます。

# Flutter Studio

[Flutter Studio](https://flutterstudio.app/)を使えばWebブラウザ上でFlutterのUIを作成することができ、かつそのコードやpubspecファイルを書き出すこともできます。うまく活用すればエンジニア以外もFlutterのデザインを作ることができます。
ただ、直前の操作を取り消すことができないっぽいのと、1度配置したものを別の場所に移動できないっぽいのが難点かなと思っています。
![FlutterStudio.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/6762d836-eb98-0b44-908f-e04090a4cbea.gif)

コードはこのようなものが出力されました。
![スクリーンショット 2020-06-07 11.46.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/f17317b9-2da7-8b80-15b3-a4c15a8eda4b.png)

# Rive

[Rive](https://rive.app/)はかつてFlareと呼ばれていたもので、ブラウザ上でアニメーションを作成することができます。つまりエンジニア以外の人も作ることが可能です。
雰囲気は↓こちらでわかるかと思います。
![animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/1c539e3d-13f3-d422-624c-d657fda69cc6.gif)

作ったアニメーションはBinary形式でエクスポートが可能で、Flutterプロジェクト上では `flare_flutter` を使って取り込むことができるようです（ここから先はやってないので気になる方は他の記事を参照してください）。

# ML Complete

TensorFlowを活用した、コード補完機能です。GitHub上のDartコードを解析して、次に入力されるコードを推測しているらしいです。

設定はFind Action（Command + Shift + A）から `Registry` を選択、
![スクリーンショット 2020-06-07 10.24.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/7a04a5c3-bb9b-32a5-1835-a36c6c02445f.png)

`dart.server.additional.arguments` に `--enable-completion-model` を設定して、再起動すればOKです。
![スクリーンショット 2020-06-07 10.26.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/949876e3-9e7d-5ef4-7b6d-72a8e0a73c6c.png)

実際これを導入してから、補完精度が上がった気がします。

# Widget等の追加、削除

Macの場合、Widgetの上で `option + Enter` をするとWidgetの追加、削除項目が現れます。下の例ではCenter Widgetを追加してみました。
![widget.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/4d3117cf-f386-4279-3071-e79a0e596fa7.gif)

ちなみに、順番を変えたり
![changeOrder](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/374827d4-d5c2-2d37-9a0f-acbc3e758908.png)

childをchildrenに変えたりすることもできます。
![convertToChildren](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/72158bdd-e1f7-623d-2ea6-846213936947.png)

iOSのStoryboard, xibでViewの階層を変えようと思ったらわりと大変ですが、これなら楽に変えられます。

# その他

Flutter x Android Studioに限った話ではないけど、以下も便利です。

## 保存時の自動フォーマット

保存をしたときに正しいフォーマットに直してくれます。設定は以下のチェックをオンにするだけです。
![autoFormat](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/b39364a7-f612-30bc-b1b2-6bae7d4a617f.png)

## メソッドの抽出

Widgetの上で  `option + command + M` すると、メソッドに切り出すことができます。
![extractMethod](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/e50d487a-b959-2f72-eb46-85b196293540.png)

## Live Template

スニペットを簡単に呼び出すことができる機能です。デフォルトでいくつか定義されていますが、自分で追加することもできます。
![liveTemplate](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/1064be63-48b9-d00a-3aac-818756fd8c1e.png)
動きとしてはこんなかんじです。
![liveTemplete.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/78f58cbe-635b-5190-529d-8d83e9537306.gif)