前置き
FlutterでFlavor毎にアプリのアイコンを変更するときにはまったので、その記録を残します。(恐らくWindowsだけです。)
Flutterでflavorの設定をした記録を書きましたが、その続きになります。
flutter launcher icons
Flutterでアプリのアイコンを作成する場合は、flutter launcher icons とっても便利なツールを使用します。
基本的な使い方は、公式GitHubや検索すれば素晴らしい記事が出てくると思いますので、割愛します。
flutter launcher icons でflavorに対応するにはflavorブランチから取ってきます。
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を作成します。
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にあるソースコードを見てみると、getFlavors() で正規表現を使いパターンに合ったファイルを見つけてきているので、動作するように見えます。
しかし、実際にはパターンにあったファイルが見つからず、作成した設定ファイルが無視されているようです。
見ているだけではわからないので、実際のソースを書き換えて動作を確認してみます。
.packagesにソースコードのパスが記載されていますが、そこに記載されているコードを修正しても何も変化はありません。(実際はどのファイルを見ているのか探しました。汗)
答えはpubspec.lockにあり、flutter_launcher_iconsはGitHubを直接見に行っていることがわかります。
.packagesにあるパスは一体何なのか・・・
GitHubにあるファイルはもちろん編集できませんので、ローカルにあるファイルを見てもらうように修正ます。
dev_dependencies:
flutter_launcher_icons:
path: (flutterがインストールされているパス)/.pub-cache/git/flutter_launcher_icons-6a1e009d085a0a0b882d546e0bdaee3573011204
これで、ローカルにあるソースコードで確認ができます。
そのまま実行すると、今度は別のエラーが発生するので、ここを参考にすると、imageの依存関係でエラーになっているようですので、修正します。
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
無事に動作しました。