在 Flutter 中的多个 Firebase 项目/环境之间切换?

Oli*_*xon 1 firebase flutter

有谁知道如何在应用程序内切换 Firebase 项目/环境,假设您有一个包含不同开发 URL 的下拉菜单。我们不是在谈论不同的构建,这对我们不起作用,并且需要将多个版本发送到 TestFlight。

我们在这里找到了一段代码。

final options = FirebaseOptions.from({});
final firebaseApp = await FirebaseApp.configure(name: 'some_app_name', options: options);
Run Code Online (Sandbox Code Playgroud)

但我们不知道如何使用它,也不知道它是否能正常工作。

编辑

当我写这篇文章时,它还没有得到官方支持。现在是了。

小智 6

我处理多个环境的方法 - 使用多个项目和一个.env文件来确定使用哪个。

项目设置

  1. 我使用Flutterfire CLI来设置 Firebase 项目:
flutterfire configure
Run Code Online (Sandbox Code Playgroud)
  1. 创建项目后,我重命名了配置文件以代表环境:
mv android/app/google-services.json android/app/google-services-<env>.json
mv ios/firebase_app_id_file.json ios/firebase_app_id_file-<env>.json 
mv lib/firebase_options.dart lib/firebase_options_<env>.dart
Run Code Online (Sandbox Code Playgroud)

对于您需要的每个环境,重复步骤 1-2。

环境变量设置

  1. 使用flutter_dotenv加载用于确定环境的环境变量 .env::
# Set choose environment. Options: production, stage, etc...
ENVIRONMENT=production
Run Code Online (Sandbox Code Playgroud)
  1. 不要忘记添加.envpubspec.yaml
flutter:
  assets:
    - .env
Run Code Online (Sandbox Code Playgroud)

连接.env中设置的环境

  1. 更新main.dart以导入环境配置,并且flutter_dotenv

主要.dart:

import 'firebase_options_prod.dart' as prod;
import 'firebase_options_stage.dart' as stage;
import 'package:flutter_dotenv/flutter_dotenv.dart';
Run Code Online (Sandbox Code Playgroud)
  1. 初始化 Firebase之前加载.env以下行:

主要.dart:

await dotenv.load(fileName: '.env');
Run Code Online (Sandbox Code Playgroud)
  1. 根据值传入适当的配置ENVIRONMENT

主要.dart:

await Firebase.initializeApp(
  options:
    dotenv.env['ENVIRONMENT'] == 'stage' ? stage.DefaultFirebaseOptions.currentPlatform :
    prod.DefaultFirebaseOptions.currentPlatform);
Run Code Online (Sandbox Code Playgroud)

以下是main()全文:

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await dotenv.load(fileName: '.env');
  try {
    await Firebase.initializeApp(
      options:
        dotenv.env['ENVIRONMENT'] == 'stage' ? stage.DefaultFirebaseOptions.currentPlatform :
        prod.DefaultFirebaseOptions.currentPlatform);
  } catch(exception) {
    if(exception is FirebaseException && exception.code == 'duplicate-app') {
      debugPrint("Did you forget to recompile the Runner app, after changing environments?");
    }
    rethrow;
  }
  runApp(const MyApp());
}
Run Code Online (Sandbox Code Playgroud)

注意添加的try/catch/rethrow。我添加这个是因为当你改变环境时,你不能热启动。您需要重新编译运行器应用程序。如果您不这样做,然后更改环境,Firebase 会抛出如下错误:

Unhandled Exception: [core/duplicate-app] A Firebase App named "[DEFAULT]" already exists
Run Code Online (Sandbox Code Playgroud)

所以我想要一个简单的提醒我为什么会看到这个错误。