Firebase在Flutter中的后台消息处理程序会生成重复的分离体并运行应用程序两次。

4 浏览
0 Comments

Firebase在Flutter中的后台消息处理程序会生成重复的分离体并运行应用程序两次。

我在我的pubspec.yaml文件中有以下的包:

firebase_core: ^2.2.0

firebase_messaging: ^14.1.0

在我的main.dart文件中:

@pragma('vm:entry-point')

Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async {

}

void main() {

WidgetsFlutterBinding.ensureInitialized();

FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

runApp(const MyApp());

}

这导致我的主方法在两个隔离区中运行两次。如果我删除FirebaseMessaging.onBackgroundMessage(...)这一行,它只会运行一次。

当我在runApp(...)处设置断点时,在vscode的调用堆栈窗口中可以看到这一点。

没有onBackgroundMessage这一行:

single isolate running main method

onBackgroundMessage这一行:

two isolates running main method

由于这个原因,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

0
0 Comments

问题出现的原因是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问题。

0