Flutter启动时FCM报Null check operator used on a null value异常如何处理?
问题原因
该空值报错由两个不规范写法触发:
- 异步初始化时序错误:
messageHandler是异步函数,你在main函数中调用时未添加await关键字,Firebase 还未完成初始化就调用了后台消息注册接口,触发底层空值异常 - 后台消息处理函数不符合要求:
FirebaseMessaging.onBackgroundMessage要求传入的回调必须是顶层(全局)非嵌套函数,不能定义在其他函数或类内部,否则底层注册时无法正常获取函数引用会抛出空异常
修正方案
1. 修正main函数调用逻辑
给messageHandler调用添加await,等待初始化逻辑全部执行完成再启动应用:
Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); await messageHandler(); runApp(const App()); }
2. 规范后台消息处理函数定义
将_messageHandler定义为全局顶层函数,添加@pragma('vm:entry-point')注解防止发布版编译时被tree shaking移除,同时后台运行的isolate环境独立,需要单独初始化Firebase:
@pragma('vm:entry-point') Future<void> _messageHandler(RemoteMessage message) async { await Firebase.initializeApp(); // 此处添加你的后台消息处理逻辑 }
3. 修正messageHandler中的注册逻辑
直接传入顶层的_messageHandler作为回调,不要嵌套匿名函数:
Future<void> messageHandler() async { await Firebase.initializeApp(); await FirebaseMessaging.instance .setForegroundNotificationPresentationOptions( alert: true, badge: true, sound: true, ); FirebaseMessaging.onMessage.listen((RemoteMessage event) { LocalNotification.showNotification(event); }); FirebaseMessaging.onBackgroundMessage(_messageHandler); }
内容的提问来源于stack exchange,提问作者Ananda Pramono
相关产品推荐
相关产品推荐

