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
相关产品推荐
相关产品推荐

