【Flutter】環境変数をファイルで設定する

はじめに

Flutterアプリケーションを開発する際、APIキーなどの秘密情報をどのように管理すればよいか、悩んだことはありませんか?直接コードにハードコードすると、情報が漏洩するリスクがあります。また、環境によって値を変えたい場合にも対応が難しくなります。そんな時に役立つのが、「–dart-define-from-file」コマンドです。このコマンドを使うと、秘密情報をJsonファイルに格納し、それをビルド時に読み込むことができます。この記事では、「–dart-define-from-file」コマンドの使い方を解説します。

「–dart-define-from-file」の使用方法

flutter build コマンドに –dart-define-from-file オプションを付けます。その後、等号(=)を用いて、環境変数の名前とその値が書かれたファイルのパスを指定します。例えば、

flutter build apk --dart-define-from-file=api_key.json のようになります。

実行時やビルド時に、指定したファイルの内容が環境変数の値として読み込まれます。この環境変数は、アプリケーション内から String.fromEnvironment(‘API_KEY’) のようにアクセスできます。
キーが含まれたファイルは .gitignore に追加し、バージョン管理から除外します。これにより、秘密情報が誤って公開されるリスクを避けることができます。

まとめ

FlutterでAPIキーなどの秘密情報を安全に管理するためには、–dart-define-from-fileを用いる方法が推奨されます。直接コードに秘密情報をハードコードするのではなく、ファイルから読み込むことで、誤って公開されるリスクを避け、よりセキュアなアプリケーション開発が可能になります。また、この方法は公式にサポートされており、AndroidやiOSのネイティブサイドでもキーを共有することが可能です。しかし、最終的にはどの方法を選択するかは、アプリケーションの要件や開発チームの状況によります。

全テストコード (コピペして、実行確認済)

環境変数用のJSON

環境変数を定義します。ここでは、「lib\main_define_from_file.json」というファイルにします。

{
  "DART_DEFINE_FROM_FILE_TEST": "dart-define-from-file-test"
}

ちなみに、キーを間違えた場合、「null」として動作しました(実行時に警告は出る、ビルド時にエラーが欲しい、、、)。

Flutterソース

都合で「lib\main_define_from_file.dart」というファイルにしています。
String.fromEnvironment(‘DART_DEFINE_FROM_FILE_TEST’)で、Jsonのデータを定数として読み込んでいます。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

const kDartDefineFromFileTest =
    String.fromEnvironment('DART_DEFINE_FROM_FILE_TEST');

class MyHomePage extends StatelessWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Center(
        child: Text(kDartDefineFromFileTest),
      ),
    );
  }
}

実行

以下のコマンドで実行します。main.dartなら最後のDartファイル名は不要です。

flutter run --dart-define-from-file=lib\main_define_from_file.json lib\main_define_from_file.dart

参考