Firebase在Flutter中的后台消息处理程序会生成重复的分离体并运行应用程序两次。
Firebase在Flutter中的后台消息处理程序会生成重复的分离体并运行应用程序两次。
我在我的pubspec.yaml
文件中有以下的包:
firebase_core: ^2.2.0
firebase_messaging: ^14.1.0
在我的main.dart
文件中:
@pragma('vm:entry-point')
Future
}
void main() {
WidgetsFlutterBinding.ensureInitialized();
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
runApp(const MyApp());
}
这导致我的主方法在两个隔离区中运行两次。如果我删除FirebaseMessaging.onBackgroundMessage(...)
这一行,它只会运行一次。
当我在runApp(...)
处设置断点时,在vscode的调用堆栈窗口中可以看到这一点。
没有onBackgroundMessage
这一行:
有onBackgroundMessage
这一行:
由于这个原因,firebase的onMessage
和其他处理程序会为每个通知触发两次,并且会重复执行相同的工作,由于它们在不同的隔离区中,很难检测和避免。 (上面的示例中没有这部分)
我发现MyApp
的构建方法也会运行两次,这是我不想要的。这可能会造成内存和计算的开销,我希望能够避免。
我想知道这是否是正常的行为?如果是,有没有办法避免这种情况?即是否有一种方法可以检测到重复的隔离区并使主方法返回?
如果这不是正常的行为,我做错了什么?
为了完整起见,flutter --version
的输出结果如下:
Flutter 3.3.6 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 6928314d50 (3 weeks ago) • 2022-10-25 16:34:41 -0400
Engine • revision 3ad69d7be3
Tools • Dart 2.18.2 • DevTools 2.15.0
问题出现的原因是Firebase团队在更新版本时引入了一些更改,导致在Flutter中使用Firebase背景消息处理程序时生成了重复的隔离并运行应用程序两次。解决方法是使用特定的Firebase包版本或等待将来的修复版本。
在给出的更新中,Firebase团队推荐的版本是:
firebase_core: 2.3.0
firebase_remote_config: 3.0.6
firebase_analytics: 10.0.6
firebase_crashlytics: 3.0.6
firebase_messaging: 14.1.1
如果只使用消息传递服务,可以使用以下版本:
firebase_core: ^1.24.0
firebase_messaging: ^13.1.0
如果使用其他Firebase服务,可以使用以下版本,这些版本已经在不使用依赖项覆盖的情况下成功运行:
firebase_core: 1.24.0
firebase_remote_config: 2.0.20
firebase_analytics: 9.3.8
firebase_crashlytics: 2.9.0
firebase_messaging: 13.1.0
目前,要么接受Bug并使用最新版本的所有包,要么将Firebase包锁定到上述版本,并等待有时间尝试更新到最新版本并检查有什么问题。这个问题很可能会在将来的修复版本中得到解决。
参考了stackoverflow上的一个问题和答案以及相关的GitHub问题。