Flutterの開発環境構築方法(Mac)

## はじめに

本記事は [エムティーアイ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/mti) の1日目の記事です。

Flutterの開発環境を構築する方法を紹介します。

ちなみに業務ではFlutterを一切触っていません。
昨日行われた [FlutterKaigi](https://flutterkaigi.jp/#/) のハンズオンで初めてFlutterを触り、その準備時に行ったことを残します。

## 環境

- OS：macOS Big Sur 11.6
- ハード：MacBook Air (M1, 2020)
- Flutter：2.5.1

## 開発環境の構築

公式ドキュメントに沿ってFlutterの開発環境を構築します。

https://docs.flutter.dev/get-started/install/macos

### Flutter SDKのダウンロード

以下のページから、使いたいバージョンのFlutter SDKをダウンロードします。

https://docs.flutter.dev/development/tools/sdk/releases?tab=macos

特に決まりがなければ、Stable channelの最新を使うのがいいと思います。

ダウンロードが完了したら解凍します。
場所はどこでもいいですが、本記事では公式ドキュメント通り `~/development` フォルダを作成して、そこに展開します。

以下はStable channelの `2.5.1` を解凍する例です。

```shell-session
$ cd ~
$ mkdir development
$ cd development/
$ unzip ~/Downloads/flutter_macos_2.5.1-stable.zip
```

### Flutter SDKのパスを通す

Flutter SDKを展開したら、パスを通します。

私はBashを使っているので `.bash_profile` に以下を追記します。

```diff_shell:.bash_profile
+ export FLUTTER_HOME="${HOME}/development/flutter"
+ if [ -d "${FLUTTER_HOME}" ]; then
+   export PATH="${FLUTTER_HOME}/bin:$PATH"
+ fi
```

`.bash_profile` を再読み込みし、 `flutter --version` でバージョンが出力されたらOKです。

```shell-session
$ source ~/.bash_profile 
$ flutter --version
Flutter 2.5.1 • channel stable • https://github.com/flutter/flutter.git
Framework • revision ffb2ecea52 (2 months ago) • 2021-09-17 15:26:33 -0400
Engine • revision b3af521a05
Tools • Dart 2.14.2
```

どうやらDartもFlutter SDKに同梱されているようです。

### flutter doctorを実行する

`flutter` コマンドが使えるようになったら `flutter doctor` を実行して、他にインストールすべき依存関係がないか確認します。

太字で×が付いたタスクがあればそれを実行します。

```shell-session
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 2.5.1, on macOS 11.6 20G165 darwin-arm, locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[!] Xcode - develop for iOS and macOS
    ✗ CocoaPods not installed.
        CocoaPods is used to retrieve the iOS and macOS platform side's plugin code that responds to your plugin usage on the Dart side.
        Without CocoaPods, plugins will not work on iOS or macOS.
        For more info, see https://flutter.dev/platform-plugins
      To install see https://guides.cocoapods.org/using/getting-started.html#installation for instructions.
[✓] Chrome - develop for the web
[!] Android Studio
    ✗ Unable to find bundled Java version.
[✓] Android Studio (version 2020.3)
[✓] VS Code (version 1.60.0)
[✓] Connected device (1 available)

! Doctor found issues in 2 categories.
```

最初は4つ×があったのですが、2つ解決したので2つのみ×が出力されています。
でも解決した2つとも覚えているので、それらの対応を紹介します。

ちなみに私はXcodeとAndroid Studioをインストール済でした。
未インストールの人は、インストールから行うよう指示されるはずです。

#### Android SDK Command-line Toolsがインストールされていない

以下のエラーが出力された場合、Android SDK Command-line Toolsがインストールされていません。

```shell-session
[!] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
    ✗ cmdline-tools component is missing
      Run `path/to/sdkmanager --install "cmdline-tools;latest"`
      See https://developer.android.com/studio/command-line for more details.
```

Android Studioから「Android SDK Command-line Tools (latest)」をインストールすればOKです。
![スクリーンショット_2021-11-30_16_31_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/e3fdc231-24a6-befb-3e2a-7b0cf2bd5d7d.png)

#### Androidのライセンスに同意していない

以下のエラーが出力された場合、Androidのライセンスに同意していません。

```shell-session
[!] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
    ! Some Android licenses not accepted.  To resolve this, run: flutter doctor
      --android-licenses
```

エラーの内容通り `flutter doctor --android-licenses` を実行し、必要なライセンスにすべて同意します。

```shell-session
$ flutter doctor --android-licenses
3 of 7 SDK package licenses not accepted. 100% Computing updates...             
Review licenses that have not been accepted (y/N)? y

Accept? (y/N): y
```

再度コマンドを実行して「All SDK package licenses accepted.」が出力されればOKです。

```shell-session
$ flutter doctor --android-licenses
All SDK package licenses accepted.======] 100% Computing updates...   
```

#### CocoaPodsがインストールされていない

以下のエラーが出力された場合、CocoaPodsがインストールされていません。

```shell-session
[!] Xcode - develop for iOS and macOS
    ✗ CocoaPods not installed.
        CocoaPods is used to retrieve the iOS and macOS platform side's plugin code that responds to your plugin usage on the Dart side.
        Without CocoaPods, plugins will not work on iOS or macOS.
        For more info, see https://flutter.dev/platform-plugins
      To install see https://guides.cocoapods.org/using/getting-started.html#installation for instructions.
```

私はrbenv + BundlerでCocoaPodsを管理したいので、こちらのエラーは無視しました。

Flutterによる開発ではCocoaPodsをグローバルインストールするのが一般的なのでしょうか？
もし知っている人がいたら教えてほしいです。

#### Android Studioに同梱されているJDKが見つからない

以下のエラーが出力された場合、Android Studioに同梱されているJDKが見つかりません。

```shell-session
[!] Android Studio
    ✗ Unable to find bundled Java version.
```

結論からいうと、こちらのエラーは解決できませんでした。
解決方法をご存知の人がいたら教えてほしいです。

参考までに試したことを残しておきます。

どこかのタイミングでAndroid Studioに同梱されているJDKのパスが変わったのが原因だと思い、その対応を行いました。

https://twitter.com/the_uhooi/status/1456235743659970564

```diff_shell
- /Applications/Android\ Studio\.app/Contents/jre/jdk/Contents/Home
+ /Applications/Android\ Studio\.app/Contents/jre/Contents/Home
```

私はAndroidアプリ開発以外でJavaを使わないため、 `.bash_profile` で `JAVA_HOME` にAndroid Studioに同梱されているJDKをセットしてパスを通します。
以前の `jdk` を含んだパスを指定します。

```diff_shell:.bash_profile
+ export JAVA_HOME=/Applications/Android\ Studio\.app/Contents/jre/jdk/Contents/Home
+ if [ -d "${JAVA_HOME}" ]; then
+   export PATH="${JAVA_HOME}/bin:$PATH"
+ fi
```

このままだとパスが見つからないので、以前のパスにシンボリックリンクを貼ります。

```shell-session
$ cd /Applications/Android\ Studio\.app/Contents/jre
$ ln -s ../jre jdk
$ ln -s "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin" jdk
$ cd -
```

これで `JAVA_HOME` をセットしてパスを通せたのですが、それでも解決されませんでした。なぜでしょうか…。

### Android Studioプラグインのインストール

Android StudioにFlutterのプラグインをインストールします。

プラグインの「Marketplace」タブを開き、「flutter」で検索すると簡単にインストールできます。
![スクリーンショット_2021-11-30_17_58_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/bb298b8d-9953-90ce-0e9f-c49591a7a46c.png)

Dartのプラグインが必要だといわれるので、「Install」を押下します。
![スクリーンショット_2021-11-30_17_58_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/2d5c381d-3819-b070-b084-d0f1b22bd2e9.png)

Android Studioを再起動し、「Installed」タブに「Dart」と「Flutter」があればOKです。
![スクリーンショット_2021-12-01_23_02_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/a404b732-0af3-7ae8-c62e-d2c90fc5a797.png)

ちなみにどちらのプラグインもOSSで開発されています。

https://github.com/flutter/flutter-intellij

https://github.com/JetBrains/intellij-plugins/tree/master/Dart

## おまけ: Flutter SDKの管理ツール

本記事ではFlutter SDKを手動で管理していますが、それだと複数のプロジェクトで異なるバージョンを使いたいときに困ります。
Flutterには [fvm](https://github.com/leoafarias/fvm) や [asdf](https://github.com/asdf-vm/asdf) などの管理ツールがあり、これらを使うことで手動管理のデメリットを解消できます。

TwitterでFlutter SDKをどのように管理しているかアンケートを取ってみました。

https://twitter.com/the_uhooi/status/1466067921218654208

結果はfvmが最も多かったです。
ただasdfも流行ってきているとのことなので、各管理ツールのメリットやデメリットを調査し、プロジェクトに合ったツールを選定するのがよさそうです。

## おわりに

まだ不十分なところもありますが、Flutterの開発環境が構築できました！
FlutterでUIを気持ちよく組み立てていきましょう :relaxed:

以上 [エムティーアイ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/mti) の1日目の記事でした。

## 参考リンク

- https://twitter.com/the_uhooi/status/1465571548463464451
- [1. Flutter 環境構築 · FlutterKaigi/atomic_design_handson Wiki](https://github.com/FlutterKaigi/atomic_design_handson/wiki/1.-Flutter-環境構築)
- [flutter doctorで「Unable to find bundled Java version.」となる場合の解決法](https://zenn.dev/donchan922/articles/85d16dbf8958c6)