Flutter项目接入同一账号下两个Firebase实时数据库
问题描述
我有一个名为twoaccountfirebasedifferentinjustproject的Flutter Web项目,已上传至GitHub,待问题解决后可供他人参考使用。项目初始运行界面:
我在同一Firebase账号下创建了两个项目:
- twoaccountfirebaseone
- twoaccountfirebasetwo
两个项目均启用了Realtime Database服务。
目前已通过flutter configure完成twoaccountfirebaseone的Realtime Database配置,系统自动生成了google-services.json和firebase_options.dart文件,修改main.dart后可正常访问及操作该数据库,相关代码及效果如下:
初始化代码
import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_database/firebase_database.dart'; import 'package:flutter/material.dart'; import 'firebase_options.dart'; void main() async{ WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); runApp( MaterialApp( home: const MyApp(), ),); }
写入数据代码(main.dart第61-70行)
FirebaseDatabase database = FirebaseDatabase.instance; final date = DateTime.now().toString(); final timenow = date.split('.'); final DBRef = FirebaseDatabase.instance.ref('example/'+timenow[0]); await DBRef.set({ 'timenow': timenow[0], });
写入效果:
清空数据库代码(main.dart第89-96行)
FirebaseDatabase database = FirebaseDatabase.instance; final date = DateTime.now().toString(); final timenow = date.split('.'); final DBRef = FirebaseDatabase.instance.ref('/'); await DBRef.set(null);
清空效果:
现在需要在该Flutter项目中同时接入twoaccountfirebasetwo的Realtime Database,实现两个数据库的并行访问与操作。已知需要创建第二个数据库实例,但不清楚具体操作方法,也不知道如何创建第二个firebase_options.dart文件,以及如何处理google-services.json文件的合并或新增。
已尝试参考相关步骤,GitHub项目已更新,希望得到帮助,同时请告知解决方法对应的文档来源,帮助提升解决问题的能力。
解决方案
1. 准备第二个Firebase项目配置文件
- 下载
twoaccountfirebasetwo的google-services.json,重命名为google-services-two.json,存到对应目录(Web项目放web文件夹,Android项目放android/app文件夹)。 - 手动创建
firebase_options_two.dart文件,复制firebase_options.dart的结构,替换为第二个项目的实际配置参数:
import 'package:firebase_core/firebase_core.dart'; class DefaultFirebaseOptionsTwo { static FirebaseOptions get currentPlatform { return FirebaseOptions( apiKey: "替换为第二个项目的API_KEY", authDomain: "twoaccountfirebasetwo.firebaseapp.com", databaseURL: "https://twoaccountfirebasetwo-default-rtdb.firebaseio.com", projectId: "twoaccountfirebasetwo", storageBucket: "twoaccountfirebasetwo.appspot.com", messagingSenderId: "替换为第二个项目的Sender ID", appId: "替换为第二个项目的App ID", measurementId: "替换为第二个项目的Measurement ID", ); } }
2. 初始化双Firebase App实例
修改main.dart,同时初始化两个App实例:
import 'firebase_options.dart'; import 'firebase_options_two.dart'; void main() async{ WidgetsFlutterBinding.ensureInitialized(); // 初始化第一个默认App await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); // 初始化第二个命名App,通过name参数区分实例 await Firebase.initializeApp( options: DefaultFirebaseOptionsTwo.currentPlatform, name: "secondaryApp", ); runApp(const MaterialApp(home: MyApp())); }
3. 操作第二个Realtime Database
通过指定App实例获取第二个数据库引用,实现并行操作:
// 获取第二个App实例 final secondaryApp = Firebase.app("secondaryApp"); // 创建第二个数据库实例 final secondaryDatabase = FirebaseDatabase.instanceFor(app: secondaryApp); // 写入第二个数据库 final date = DateTime.now().toString(); final timenow = date.split('.'); final secondaryDBRef = secondaryDatabase.ref('example/${timenow[0]}'); await secondaryDBRef.set({'timenow': timenow[0]}); // 清空第二个数据库 final secondaryDBRoot = secondaryDatabase.ref('/'); await secondaryDBRoot.set(null);
4. Web项目额外配置
在web/index.html的<body>标签内添加双项目的Firebase初始化脚本:
<!-- 第一个项目初始化 --> <script type="module"> import { initializeApp } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-app.js"; const primaryConfig = { // 第一个项目的配置参数 }; initializeApp(primaryConfig); </script> <!-- 第二个项目初始化 --> <script type="module"> import { initializeApp } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-app.js"; const secondaryConfig = { // 第二个项目的配置参数 }; initializeApp(secondaryConfig, "secondaryApp"); </script>
参考文档
- Firebase官方:多项目使用指南
- Flutter Firebase:多App初始化说明
- Realtime Database:多数据库访问文档
内容的提问来源于stack exchange,提问作者Luciano Cruz Junior
相关产品推荐
相关产品推荐

