You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter集成Firebase Messaging遇“FlutterJNI.loadLibrary多次调用”报错求助

解决Flutter集成Firebase Messaging时的“FlutterJNI.loadLibrary called more than once”错误

你的猜测完全正确,问题根源就是两次调用Firebase.initializeApp():主进程的main函数里已经完成了Firebase初始化,而后台消息处理函数_firebaseMessagingBackgroundHandler又重复执行初始化操作,导致Flutter引擎相关组件被多次加载,触发报错。

修改方案

后台消息处理运行在独立的Dart隔离环境中,但不需要重复初始化Firebase。通过判断Firebase应用实例是否存在,避免重复调用初始化方法即可:

@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(_) async {
  // 仅在当前环境未初始化Firebase时执行初始化
  if (Firebase.apps.isEmpty) {
    await Firebase.initializeApp();
  }
  // 这里可添加后台消息的具体处理逻辑
}

修改后的完整代码

@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(_) async {
  if (Firebase.apps.isEmpty) {
    await Firebase.initializeApp();
  }
}

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  await FirebaseAppCheck.instance.activate(
    androidProvider: AndroidProvider.playIntegrity,
  );
  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
  await flutterLocalNotificationsPlugin
      .resolvePlatformSpecificImplementation<
          AndroidFlutterLocalNotificationsPlugin>()
      ?.createNotificationChannel(channel);
  await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
    alert: true,
    badge: true,
    sound: true,
  );
  runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider(
          create: (_) => MainProvider(),
        ),
        ChangeNotifierProvider(
          create: (_) => SellerFormProvider(),
        ),
        ChangeNotifierProvider(
          create: (_) => LocationProvider(),
        ),
      ],
      child: const MyApp(),
    ),
  );
  SystemChrome.setPreferredOrientations([
    DeviceOrientation.portraitUp,
    DeviceOrientation.portraitDown,
  ]);
}

原理说明

后台消息处理的隔离环境会启动独立的FlutterEngine实例,主进程的Firebase初始化不会直接作用于这个隔离环境。通过Firebase.apps.isEmpty判断当前环境是否已完成初始化,仅在未初始化时执行Firebase.initializeApp(),就能避免重复初始化导致的FlutterJNI重复加载问题。

内容的提问来源于stack exchange,提问作者Vasudev Soni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:40:50