WindowsでFlutterのflavor向けicon作成でつまった話

### 前置き

FlutterでFlavor毎にアプリのアイコンを変更するときにはまったので、その記録を残します。(恐らくWindowsだけです。)
Flutterでflavorの設定をした[記録](https://qiita.com/rottonton/items/579ad9273c5d01cf73f9)を書きましたが、その続きになります。

### flutter launcher icons
Flutterでアプリのアイコンを作成する場合は、flutter launcher icons とっても便利なツールを使用します。

基本的な使い方は、公式[GitHub](https://github.com/fluttercommunity/flutter_launcher_icons/tree/master)や検索すれば素晴らしい記事が出てくると思いますので、割愛します。

flutter launcher icons でflavorに対応するにはflavorブランチから取ってきます。

```yaml:pubspec.yaml
dev_dependencies:
  flutter_launcher_icons:
      git:
        url: https://github.com/fluttercommunity/flutter_launcher_icons.git
        ref: flavors
```

```
$ flutter packages get
```

公式GitHubにもflvor対応について書いてあります。
>Flavor support
>
>Create a Flutter Launcher Icons configuration file for your flavor. 
>The config file is called flutter_laucher_icons-(flavor).yaml 
>by replacing (flavor) by the name of your desired flavor.
>
>The configuration file format is the same.

Google翻訳
>フレーバーサポート
>あなたのフレーバー用のFlutter Launcher Icons設定ファイルを作成してください。 
設定ファイルの名前はflutter_laucher_icons-(flavor)> .yamlで、
(flavor)を希望のフレーバーの名前に置き換えます。
>
>設定ファイルのフォーマットは同じです。

書いてある通りに、プロジェクトのルートにflutter_launche_icons-flavor.yamlを作成します。

```yaml:flutter_launcher_icons-app1.yaml
flutter_icons:
  image_path: "assets/1/app1_icon.png" //ここで指定する画像をflavorごとに変えます。
  android: true
  ios: true
```

これをflavorの数だけ作成します。
ファイルを作成したら、flutter launcher icons のコマンドを実行すればアイコンが作成されます。

```
$ flutter packages pub run flutter_launcher_icons:main
```

```
*** ERROR ***
NoConfigFoundException
Check that your config file `flutter_launcher_icons.yaml` has a `flutter_icons` section
pub finished with exit code 1
```

と思ったら、残念ながらエラーになります。

GitHubにある[ソースコード](https://github.com/fluttercommunity/flutter_launcher_icons/blob/flavors/lib/main.dart)を見てみると、getFlavors() で正規表現を使いパターンに合ったファイルを見つけてきているので、動作するように見えます。
しかし、実際にはパターンにあったファイルが見つからず、作成した設定ファイルが無視されているようです。

見ているだけではわからないので、実際のソースを書き換えて動作を確認してみます。
.packagesにソースコードのパスが記載されていますが、そこに記載されているコードを修正しても何も変化はありません。(実際はどのファイルを見ているのか探しました。汗)
答えはpubspec.lockにあり、flutter_launcher_iconsはGitHubを直接見に行っていることがわかります。
.packagesにあるパスは一体何なのか・・・
GitHubにあるファイルはもちろん編集できませんので、ローカルにあるファイルを見てもらうように修正ます。

```yaml:pubspec.yaml
dev_dependencies:
  flutter_launcher_icons:
    path: (flutterがインストールされているパス)/.pub-cache/git/flutter_launcher_icons-6a1e009d085a0a0b882d546e0bdaee3573011204
```

これで、ローカルにあるソースコードで確認ができます。
そのまま実行すると、今度は別のエラーが発生するので、[ここ](https://github.com/fluttercommunity/flutter_launcher_icons/issues/104)を参考にすると、imageの依存関係でエラーになっているようですので、修正します。

```yaml:pubspec.yaml
dependency_overrides:
  image: 2.0.7
```

ようやくflutter launcher iconsが動作するようになったので、試しにRegExpでマッチさせようとしてるパターンと文字列を表示してみました。
/の部分が違うようです。Windowsのメモ帳で開くと円マークになります。

.\flutter_launcher_icons-app1.yaml //パス文字列
./flutter_launcher_icons-(.*).yaml //パターン

これにより、正規表現のMatchせずにflavorが無視される原因になります。

```
const flavorConfigFilePattern = "\./flutter_launcher_icons-(.*).yaml";
//この内容を下に変更します。
const flavorConfigFilePattern = "flutter_launcher_icons-(.*).yaml";
```

**flutter launcher iconsを実行する前にAndroidManifest.xml　のバックアップを取ってください。
初実行時に内容が消えてしまうようです。**


```
$flutter packages pub run flutter_launcher_icons:main
Android minSdkVersion = 16
Creating default icons Android
Overwriting the default Android launcher icon with a new icon
Building iOS launcher icon for app1
Android minSdkVersion = 16
Creating default icons Android
Overwriting the default Android launcher icon with a new icon
Building iOS launcher icon for app2
```

無事に動作しました。

あとはそれぞれflutter run すればアイコンが使用されます。
![app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437820/e5c65011-286d-b970-fab0-6c0ae0fd7597.png)