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 在前台显示多个通知

Firebase for Flutter 登录构建失败

Flutter 现有项目到 WebApp + Firebase (Firestore + Hosting)

如何在 Flutter 应用程序中更新 Firebase 令牌并存储它?

构建 Flutter iOS 应用程序时出错 - Firebase

Flutter:Google Maps 如何从 Firestore 设置图标