Flutterプロジェクト準備

XCodeで開く(コマンドライン)
open ios/Runner.xcworkspace
Cocoapodsなどを使用している場合はRunner.xcodeproj
ではなくRunner.xcworkspace
を開く。
シミュレータの起動(コマンドライン)
open -a simulator

xcconfig
iosでは、Debug
/Profile
/Release
の3つが用意されている。
Debug:開発時に使用。ホットリロードやDevToolsなどまざまな拡張サービスを使用できる。低速な動作で実行される。
Profile:開発ツールなど、最低限の拡張サービスが使用できる。ほぼReleaseビルドに近いパフォーマンスが得られる。
Release:本番リリース用ビルド。ツリーシェイキングなどの圧縮処理や本番アプリ用の最適化が行われる。
環境毎の設定値
Runner/Flutter/Debug.xcconfig[Release.xcconfig]
に配置されている。
Runner/Flutter/Generated.xcconfig
は共通で読み込まれる。
なおProfileビルドではReleaseビルドを使うように設定されている。(初期値)
環境毎の起動
flutter run -profile
flutter run –release

ビルド環境とは別に、バックエンドサーバーを切り分けたいとかしたい場合はFlavorという仕組みと組み合わせる。例えば下記のような組み合わせで実行したい場合など。
Debugビルドのdev環境
Debugビルドのstg環境
Debugビルドのprd環境
Profileビルドのdev環境
Profileビルドのstg環境
Profileビルドのprd環境
Releaseビルドのprd環境
や が公式から提案されている。
Dartコードの中でFlavorを取得する方法は無い
ビルド環境やFlavorの設定をしても、それらはビルド時にどの設定を使うかを指定するだけで、Dartコードの中でFlavorを取得することができない。
回避策としては、エントリファイルを分けるしかない。

Flavor要らない?
1.17より起動時のパラメータで環境変数のようなものを渡せるようになっているらしい
このように指定すると
flutter run --dart-define=SOME_VAR=SOME_VALUE --dart-define=OTHER_VAR=OTHER_VALUE
このようにDart内で呼び出せる
class EnvironmentConfig {
static const SOME_VAR = String.fromEnvironment('SOME_VAR');
static const OTHER_VAR = String.fromEnvironment('OTHER_VAR');
}
確かに要らなくなりそう?
ネイティブへの渡し方がバージョンによって異なるらしい。Flutter2.20以降では、Base64エンコードされた状態でネイティブに渡される。
In Flutter 1.17 in your Gradle, you will get a String value like: DEFINEEXAMPLE_APP_NAME=awesomeApp1,DEFINEEXAMPLE_APP_SUFFIX=.dev
In Flutter 1.20 value will be like this: DEFINEEXAMPLE_APP_NAME%3Dawesome1,DEFINEEXAMPLE_APP_SUFFIX%3D.dev
And in Flutter 2.2 each variable will be encoded with base64: REVGSU5FRVhBTVBMRV9BUFBfTkFNRT1hd2Vzb21lMg==,REVGSU5FRVhBTVBMRV9BUFBfU1VGRklYPS5kZXY=
DartDefines for Android
android/app/build.gradle
にデフォルト値と、渡されたDartDefinesをデコードしするコードを挿入しておく。
DartDefines for iOS
Defineexample-defaults.xcconfig
を作成し、デフォルト値として扱う。
XcodeでSchemaを編集し、Pre-Actionを作成。デコードした内容がDefineexample.xcconfig
に出力されるようにする。(ビルド時に実行される)これをDebuとReleaseのxcconfigで読み込むように設定する。
見づらいけどコードの場所はここ

vscodeのlaunch.jsonはこのように設定
{
// IntelliSense を使用して利用可能な属性を学べます。
// 既存の属性の説明をホバーして表示します。
// 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Debug",
"request": "launch",
"type": "dart",
"args": [
"--dart-define=DEFINE_APP_NAME=FlutterDemoApp:debug",
"--dart-define=DEFINE_APP_SUFFIX=.debug"
]
},
{
"name": "Profile",
"request": "launch",
"type": "dart",
"flutterMode": "profile",
"args": [
"--dart-define=DEFINE_APP_NAME=FlutterDemoApp",
"--dart-define=DEFINE_APP_SUFFIX="
]
}
]
}
出来た!

Androidのアプリ名に反映
android/app/src/main/AndroidManifest.xml
android:label="@string/app_name"