AndroidStudioにFlutterのFVMを導入する

## FVMとは
- [FVM](https://fvm.app/documentation/getting-started)(Flutter Version Manger)のこと
- FlutterSDKのバージョン管理ツール
- 複数のFlutterをインストールし、プロジェクト毎にバージョンを切り替えることが可能

Node.jsの`nvm`やRubyの`rbenv`,Pythonの`pyenv`的なイメージ
## fvmのバージョン
3.2.1
## 導入
- macOS(homebrew)
```bash
brew tap leoafarias/fvm
brew install fvm
```
- windows(choco)
```
choco install fvm
```

## バージョン確認
```bash
fvm -v
```
```
3.2.1
```

## コマンド(抜粋)
### fvm doctor
環境やプロジェクト設定に関する情報を表示
### fvm releases
インストール可能なすべてのFlutter SDKリリースを表示
```
┌───────────────────┬──────────────┬──────────┐
│ Version           │ Release Date │ Channel  │
├───────────────────┼──────────────┼──────────┤
│ v1.0.0            │ Dec 4, 2018  │ stable   │
├───────────────────┼──────────────┼──────────┤
~~~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~~~
│ 3.24.4            │ Oct 24, 2024 │ stable   │
├───────────────────┼──────────────┼──────────┤
│ 3.24.5            │ Nov 14, 2024 │ stable ✓ │
└───────────────────┴──────────────┴──────────┘

Channel:
┌─────────┬─────────┬──────────────┐
│ Channel │ Version │ Release Date │
├─────────┼─────────┼──────────────┤
│ stable  │ 3.24.5  │ Nov 14, 2024 │
└─────────┴─────────┴──────────────┘
```
### fvm install [version]
指定したFlutter SDKバージョンをインストール
```bash
fvm install 3.22.0
```
```
✓ Flutter SDK: SDK Version : 3.22.0 installed! (2.6s)
```
セットアップまで行いたい場合は`-s`オプションをつける
```bash
fvm install 3.22.0 -s
```
### fvm remove [version]
指定したFlutter SDKバージョンを削除
```bash
fvm remove 3.22.1
```
```
✓ 3.22.1 removed. (0.5s)
```
### fvm use [version] [options]
**プロジェクトで**使用するFlutter SDKバージョンを設定し
``.fvm/``ディレクトリが自動作成される

:::note warn
**プロジェクトルート**で実行すること!!
プロジェクトルートではない(pubspec.yamlが見つからない)場合
以下のように聞かれます
:::
```
No pubspec.yaml detected in this directory
? Would you like to continue? (y/n) › no
```

:::note info
installが済んでいないバージョンの場合
以下のように聞かれinstallが終了次第、セットアップされます
:::
```shell
Flutter SDK: SDK Version : 3.24.4 is not installed.
? Would you like to install it now? (y/n) › yes 
```
```
✓ Flutter SDK: SDK Version : 3.24.4 is setup
✓ Dependencies resolved. (11.0s)
✓ Project now uses Flutter SDK : SDK Version : 3.24.4
```

---
- チャンネル名を指定
```bash
fvm use stable
```
または
- バージョンを指定
```bash
fvm use 3.22.0
```
:::note warn
プロジェクトのpubspec.yamlのと指定したバージョンが合わない場合以下のように聞かれます
:::
```bash
SDK Version : 3.22.0 has Dart SDK 3.4.0 does not meet the project constraints of ^3.5.4.
This could cause unexpected behavior or issues.

? Would you like to proceed? (y/n) › no       
```
```yaml
environment:
  sdk: ">=3.4.0 <4.0.0" # プロジェクトのDartのsdkのバージョンを調整してください
```
:::note info
`.fvm/`ディレクトリ配下を`.gitignore`に追加するか尋ねられます
:::
```bash
You should add the fvm version directory ".fvm/" to .gitignore.
? Would you like to do that now? (y/n) › yes   
```
`.gitignore`に自動的に追加されます
```.gitignore
# FVM Version Cache
.fvm/
```
```bash
✓ Dependencies resolved. (2.0s)
✓ Project now uses Flutter SDK : SDK Version : 3.22.0
```
### fvm list
インストール済みのFlutter SDKバージョンを一覧表
- ``fvm use``で指定した(setupが完了したもの)`Local`に⚫︎がつく
- ``fvm global``したもの（後述）は`Global`に⚫︎がつく
- fvm installのみしか実行されていないバージョンは`NeedSetup`となる
```bash
fvm list
```
```
┌─────────┬─────────┬─────────────────┬──────────────┬──────────────┬────────┬───────┐
│ Version │ Channel │ Flutter Version │ Dart Version │ Release Date │ Global │ Local │
├─────────┼─────────┼─────────────────┼──────────────┼──────────────┼────────┼───────┤
│ 3.22.1  │         │ Need setup      │              │              │        │       │
├─────────┼─────────┼─────────────────┼──────────────┼──────────────┼────────┼───────┤
│ 3.22.0  │ stable  │ 3.22.0          │ 3.4.0        │ May 13, 2024 │ ●      │ ●     │
└─────────┴─────────┴─────────────────┴──────────────┴──────────────┴────────┴───────┘



```
### fvm global [version]
:::note warn
すでにflutterの環境構築を済ませている方は注意が必要です
:::
指定したFlutter SDKバージョンをグローバルで使用するよう設定
```bash
fvm global 3.22.1
```
```
Flutter SDK: SDK Version : 3.22.1 is now global

┌───────────────────────────────────────────────────────┐
│ ⚠ However your configured "flutter" path is incorrect │
└───────────────────────────────────────────────────────┘
CURRENT: /Users/user.name/development/flutter/bin
CHANGE TO: /Users/user.name/fvm/default/bin
```
globalで設定したので**既存のflutterのパスをfvmのパスに変える必要**があります。
パスの通し方は省略します。

:::note info
上記のコマンド`fvm grobal`を解除したい場合は``--unlink``オプションを使いましょう
:::
```bash
fvm global --unlink
```
## AndroidStudioにpathを設定する
1. 左上の方の`Settings`
![スクリーンショット 2024-11-29 23.17.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844247/0f614c9a-44f4-c629-c8e7-31fea6ca3fc5.png)

2. ``.fvm/flutter_sdk``上で右クリックし`Copy Path/Reference` `Absolute Path`
![スクリーンショット 2024-11-29 23.26.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844247/57c02e54-23a2-a239-98dd-3d72e8934331.png)

3. `Settings > Language & Frameworks > Flutter`のFlutter SDK pathに貼り付ける
![スクリーンショット 2024-11-29 23.18.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844247/28cd0893-8b9d-5783-b727-f14a14bcf4e2.png)

## 注意点
fvmの環境下ではflutterコマンドを全て``fvm flutter 〇〇``という形で打ち込む必要があります
例1 ``flutter clean``コマンドを実行したい
```
fvm flutter clean
```
例2 ``flutter pub run build_runner build --delete-conflicting-outputs``を実行したい
```
fvm flutter pub run build_runner build --delete-conflicting-outputs
```
面倒な場合はエイリアスをしておくといいと思います
- ``fvm flutter``を``flutter``としていて今まででのように``flutter 〇〇``として使えます
```shell-session
$ echo 'alias flutter="fvm flutter"' >> ~/.zshrc
$ source ~/.zshrc
```
## 参考
https://fvm.app

https://zenn.dev/altiveinc/articles/flutter-version-management-3

https://zenn.dev/altiveinc/articles/flutter-version-management

https://qiita.com/takashimelon/items/57a160106108971f1a2a