是否有可能在 Flutter 中动态启动 Firebase?

Posted

技术标签:

【中文标题】是否有可能在 Flutter 中动态启动 Firebase?【英文标题】:Is there any possibility to init Firebase in Flutter dynamically? 【发布时间】:2021-12-01 03:24:32 【问题描述】:

我尝试根据用户语言偏好来初始化 Firebase。 例如:

用户打开一个应用程序。 选择语言 A:Flutter 应该初始化项目 A(配置等)。 当用户选择不同的语言时也是如此。

问题是 ios 需要有默认的 GoogleService-Info.plist 文件。 在 Firebase 的动态初始化期间,创建了一个应用程序,但默认应用程序来自默认文件,并且优先于项目 A。最终,创建了两个应用程序(DEFAULT 和 A)。这会导致根据用户偏好将 FirebaseMessaging 分配给默认 Firebase 应用,而不是第二个。

根据 messaging.dart 文档:

  /// If [app] is not provided, the default Firebase app will be used.
  // TODO: messaging does not yet support multiple Firebase Apps. Default app only.

在这种情况下,不可能支持 Firebase 配置文件的动态初始化,因为总会有一个从默认配置文件启动的默认应用。

在本机应用程序中,我可以创建许多 .plist 文件并调用 FirebaseApp.configure(options: options)

你知道如何在 Flutter 中解决这个问题吗?

【问题讨论】:

【参考方案1】:

您在使用 FirebaseMessaging 时遇到的问题是由于 firebase_messaging 包尚不支持 .instanceFor()。否则默认应用的存在不会成为问题,但默认应用被硬编码为 FirebaseMessaging 中唯一受支持的应用。

FirebaseAuth、FirebaseFirestore 和 FirebaseStorage 软件包已添加对 .instanceFor() 的支持。如果 Firebase 消息传递 支持 instanceFor(),您可以简单地传递您的辅助应用程序名称并使用该方法引用它。相反,该软件包中缺乏支持会增加不必要的复杂性。有关实例的更多信息,请点击此处:https://firebase.flutter.dev/docs/core/usage/#secondary-firebase-apps。

有关 fcm 中缺乏多应用程序支持的更多信息可以在此处找到:https://github.com/FirebaseExtended/flutterfire/issues/5844。提到了一种可能的解决方法(我没有亲自尝试过),还有一个在https://github.com/FirebaseExtended/flutterfire/pull/6549 的公开 PR,它仍处于草稿阶段。

您也许可以使用各种风格来完成所需的功能,但我对它们不够熟悉,无法在该主题上提供帮助:https://flutter.dev/docs/deployment/flavors。

我遇到了同样的情况,选择为所有应用用户订阅默认应用实例,然后代表我的默认项目通过 firebase 云功能执行所有 fcm 调度,直到 firebase_messaging 包团队修复了他们的这个明显漏洞实施。

如果您能够将所有数据包含在单个项目中,按语言集合组织并按规则隔离,您可能也需要考虑该选项。

【讨论】:

以上是关于是否有可能在 Flutter 中动态启动 Firebase?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在使用 AWS amplify for Cognito 和 DataStore 的同时使用 fire base 来托管我的 Flutter Web 应用程序吗

Flutter 动态更改应用程序启动图标

Flutter 拖拽可以有动态端点吗?还是只是一个预定义的目标?

Flutter:Fire Base 存储图像上传的后期初始化错误

如何通过使用flutter bloc从fire存储中使用依赖注入来处理错误`The getter was called on null`

Flutter:动态链接未启动应用程序