はじめに
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