Flutter 3.19 以降で dart-define-from-file を使う方法

menu事業部 フロントエンドエンジニアのるいです。 皆さんはこちらのブログを読みましたか。

techblog.reazon.jp

Flutterでは、アプリのビルドや起動時に --dart-define-from-file オプションを付けることで、指定されたファイルから環境変数を設定し、さまざまな設定を調整できます。

しかし、この --dart-define-from-file オプションは3.19のSDKリリース以降不具合(※)が発生し、直接使用できなくなりました。

※2024/05執筆時点において発生している事象です。
詳細や対応進捗は「参考リンク」項にある issue を参照してください。

今回調査した結果、一時的な解消方法を共有させていただきます。

修正対象

以下に該当する方は、今回の不具合修正が必要となります。

  • 3.19以降のFlutter SDKを使用している方
  • 新しく3.19系のFlutter SDKを使用したリポジトリをCloneする方

ただし、既にエミュレーター上でアプリを起動し、--dart-define-from-file を指定してファイルの内容を取得した経験のある方は対象外です。

事象/影響

この不具合について、ビルドやエミュレーター上でアプリを起動する際、ネイティブ側が --dart-define-from-file で指定されたファイル内の項目を参照する必要がある場合、その項目が取得できずにビルドが失敗するという現象が発生します。

解決方法

現時点で、公式のFlutterチームはまだ最新バージョンのStable SDK(3.19.6)とBeta SDK(3.22.0-0.3.pre)に、この不具合の修正を含めていませんでした。

ただし、現段階ではこの不具合についてはネイティブによる一時的な解決方法があります。

Android

まず、android/app/build.gradle 内に他のdefと共に下記のコードを追加してください。

def dartEnvironmentVariables = [];
if (project.hasProperty('dart-defines')) { dartEnvironmentVariables = project.property('dart-defines')
        .split(',')
        .collectEntries { entry ->
            def pair = new String(entry.decodeBase64(), 'UTF-8').split('=')
            [(pair.first()): pair.last()]
        }
}

その後、--dart-define-from-file で指定した項目を含むファイルにある使用項目の前にこのようなプレフィックスを追加すれば完成です。

例:

defaultConfig {
    applicationId dartEnvironmentVariables.APPLICATION_ID ... }
iOS

まずXcodeを開き、アプリのRunnerを押し、Edit Scheme を押してください。 その後、BuildのSchemeに新しいPre-actionを追加してください。 こちらの画面にアプリのRunnerを指定し、下記のスクリプトを追加しましたら完成です。

function entry_decode() { echo "${*}" | base64 --decode; }

IFS=',' read -r -a define_items <<< "$DART_DEFINES"

for index in "${!define_items[@]}"
do
    define_items[$index]=$(entry_decode "${define_items[$index]}");
done

printf "%s\n" "${define_items[@]}" > ${SRCROOT}/Flutter/Environment.xcconfig

その後、ダイアログを閉じて Debug.xcconfigRelease.xcconfig の内部に #include "Environment.xcconfig" を追加してください。

上記の手順が全て完了したら、ビルドしてみてください。

それで、--dart-define-from-file の不具合が解決したかどうかを確認してみてください。

最後に

Flutter公式開発チームはいつこちらの不具合を修正するかはまだ分かりませんが、上記の修正方法が皆さんの役に立てると嬉しいです。

今後こちらの不具合のアップデートがありましたら、また皆さんに共有します。

参考リンク