Flutter:一个应用程序中有多个firebase项目,但显示的数据不正确
Posted
技术标签:
【中文标题】Flutter:一个应用程序中有多个firebase项目,但显示的数据不正确【英文标题】:Flutter: multiple firebase projects in one app but showing incorrect data 【发布时间】:2019-10-25 06:26:34 【问题描述】:最近几天我花了很多时间阅读几个 SO 问题和教程。我想要实现的是,我的 Flutter 应用程序的用户可以选择一个 Firebase 项目并使用电子邮件/密码登录。登录后,显然应该显示相应数据库的正确数据。这就是我失败的地方。
在阅读了一些来自 SO 的网站和问题一段时间后,我使用以下网站获取登录的第一部分。
https://firebase.googleblog.com/2016/12/working-with-multiple-firebase-projects-in-an-android-app.html
阅读完本文后,我能够成功登录到我定义的 Firebase 项目。
我怎么知道登录成功了?我将项目中的用户 uid 与控制台中我的应用程序中的打印语句进行了比较。这证明了我对非默认项目的配置是正确的。
但现在是我无法解决的主要问题。 登录后,数据始终是来自 google-service.json 的默认 firebase 项目的数据。
对于状态管理,我选择提供程序包,正如他们在 I/O '19 中提到的那样。所以在我的 main.dart 中,我用 MultipleProvider 包装了整个应用程序:
Widget build(BuildContext context)
return MultiProvider(
providers: [
ChangeNotifierProvider<LoginModel>(
builder: (_) => LoginModel(),
),
ChangeNotifierProvider<Auth>(
builder: (_) => Auth(),
),
],
child: MaterialApp(
title: 'Breaking News Tool',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: RootPage(),
),
);
提供的 Auth 类是一个连接到 firebase sdk 的服务,还配置非默认应用以创建所需的 firebase 身份验证
abstract class BaseAuth
getDefaultAuth();
getAbnAuth();
...
class Auth with ChangeNotifier implements BaseAuth
...
Auth()
_configureAbnApp();
_configureProdApp();
getDefaultAuth()
_firebaseAuth = FirebaseAuth.instance;
getAbnAuth()
_firebaseAuth = FirebaseAuth.fromApp(_abnApp);
_configureAbnApp()
FirebaseOptions abnOptions = FirebaseOptions(
databaseURL: 'https://[project-id].firebaseio.com',
apiKey: 'AIzaSxxxxxxxxxxxxxxxx,
googleAppID: '1:10591xxxxxxxxxxxxxxxxxxx');
FirebaseApp.configure(name: 'abn_database', options: abnOptions)
.then((result)
_abnApp = result;
);
...
登录后,应用会将用户重定向到主页(StatefulWidget)。这里我使用数据库的快照来展示数据。
_stream = Firestore.instance.collection(collection).snapshots();
...
Center(
child: Container(
padding: const EdgeInsets.all(10.0),
child: StreamBuilder<QuerySnapshot>(
stream: _stream,
builder:
(BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot)
if (snapshot.hasError)
return Text('Error: $snapshot.error');
switch (snapshot.connectionState)
case ConnectionState.waiting:
return Text('Loading...');
default:
return ListView(
children: snapshot.data.documents
.map((DocumentSnapshot document)
return CustomCard(
docID: document.documentID,
title: document[title],
message: document[message],
fromDate: document[fromDate],
endDate: document[endDate],
disableApp: document[disableApp],
);
).toList(),
);
,
),
),
),
一开始,我只有一个项目要连接,而且数据是正确的。但是现在我使用正确的用户 uid 成功连接到另一个项目,但数据始终来自 google-service.json 定义的默认项目。 在这一点上,我不知道为什么会发生这种情况。
有人有什么建议或想法吗?
【问题讨论】:
【参考方案1】:您根据Firestore.instance
创建您的_stream
,这将为您提供默认的firebase 应用程序,如文档中所述:
/// Gets the instance of Firestore for the default Firebase app.
static Firestore get instance => Firestore();
因此,您总是从默认项目中获取数据。
要解决此问题,您需要使用 FirebaseApp.configure()
创建的应用程序创建您的 Firestore。
所以替换:
_stream = Firestore.instance.collection(collection).snapshots();
与
_stream = Firestore(app: _abnApp).collection(collection).snapshots();
【讨论】:
以上是关于Flutter:一个应用程序中有多个firebase项目,但显示的数据不正确的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Firebase Cloud Messaging 在前台显示多个通知
Flutter 现有项目到 WebApp + Firebase (Firestore + Hosting)
如何在 Flutter 应用程序中更新 Firebase 令牌并存储它?