You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Web多环境配置问题及Firestore+dotenv示例请求

首先,那个Chrome的source map报错是浏览器自身的小问题,不会影响项目运行,不用在意。你项目卡在加载页,核心是Web端多环境配置没到位,导致Firebase初始化失败。下面是Flutter Web结合dotenv+Firebase Firestore的多环境配置完整示例:

一、安装依赖

在pubspec.yaml里添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_dotenv: ^5.1.0
  firebase_core: ^2.15.0
  cloud_firestore: ^4.8.0

执行flutter pub get完成安装。

二、准备环境配置文件

在项目根目录创建三个环境配置文件,分别对应不同环境:

  • .env.local(本地开发环境)
FIREBASE_API_KEY=你的本地Firebase项目API_KEY
FIREBASE_AUTH_DOMAIN=你的本地项目AUTH_DOMAIN
FIREBASE_PROJECT_ID=你的本地项目PROJECT_ID
FIREBASE_STORAGE_BUCKET=你的本地项目STORAGE_BUCKET
FIREBASE_MESSAGING_SENDER_ID=你的本地项目MESSAGING_SENDER_ID
FIREBASE_APP_ID=你的本地项目APP_ID
  • .env.staging(预发布环境):替换为预发布Firebase项目的对应参数
  • .env.production(生产环境):替换为生产Firebase项目的对应参数

注意:把这三个.env文件加入.gitignore,避免敏感信息提交到代码仓库。

三、配置pubspec识别环境文件

在pubspec.yaml的flutter节点下添加资源声明:

flutter:
  assets:
    - .env.local
    - .env.staging
    - .env.production
四、编写环境配置与Firebase初始化逻辑

在lib目录下创建env_config.dart:

import 'package:flutter_dotenv/flutter_dotenv.dart';

class EnvConfig {
  static late String apiKey;
  static late String authDomain;
  static late String projectId;
  static late String storageBucket;
  static late String messagingSenderId;
  static late String appId;

  static Future<void> load(String env) async {
    final envFileName = '.env.$env';
    await dotenv.load(fileName: envFileName);
    
    apiKey = dotenv.get('FIREBASE_API_KEY');
    authDomain = dotenv.get('FIREBASE_AUTH_DOMAIN');
    projectId = dotenv.get('FIREBASE_PROJECT_ID');
    storageBucket = dotenv.get('FIREBASE_STORAGE_BUCKET');
    messagingSenderId = dotenv.get('FIREBASE_MESSAGING_SENDER_ID');
    appId = dotenv.get('FIREBASE_APP_ID');
  }
}

修改main.dart,实现基于环境参数的Firebase初始化:

import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'env_config.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 获取命令行传入的环境参数,默认用local
  const env = String.fromEnvironment('env', defaultValue: 'local');
  
  // 加载对应环境的配置
  await EnvConfig.load(env);
  
  // 初始化Firebase
  await Firebase.initializeApp(
    options: FirebaseOptions(
      apiKey: EnvConfig.apiKey,
      authDomain: EnvConfig.authDomain,
      projectId: EnvConfig.projectId,
      storageBucket: EnvConfig.storageBucket,
      messagingSenderId: EnvConfig.messagingSenderId,
      appId: EnvConfig.appId,
    ),
  );
  
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Firebase多环境测试')),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 测试Firestore连接是否正常
              final snapshot = await FirebaseFirestore.instance.collection('test').get();
              print('Firestore数据条数:${snapshot.docs.length}');
            },
            child: const Text('测试Firestore连接'),
          ),
        ),
      ),
    );
  }
}
五、运行/打包对应环境
  • 本地环境运行:
flutter run -d chrome --dart-define env=local
  • 预发布环境运行:
flutter run -d chrome --dart-define env=staging
  • 生产环境打包:
flutter build web --dart-define env=production

这套逻辑可以和你已配置的Android/iOS Flavor统一,只需要在对应平台的启动命令中传递相同的env参数,就能保证多端环境一致。

内容的提问来源于stack exchange,提问作者Baptiste Coulon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:22:52