Flutter:FCM未处理异常:空值检查运算符用于空值

Posted

技术标签:

【中文标题】Flutter:FCM未处理异常:空值检查运算符用于空值【英文标题】:Flutter: FCM Unhandled Exception: Null check operator used on a null value 【发布时间】:2021-07-22 01:46:48 【问题描述】:

E/flutter (26872): [错误:flutter/lib/ui/ui_dart_state.cc(199)] 未处理的异常:对空值使用空检查运算符 E/颤振 (26872): #0 MethodChannelFirebaseMessaging.registerBackgroundMessageHandler (包:firebase_messaging_platform_interface/src/method_channel/method_channel_messaging.dart:173:53) E/颤振 (26872): #1 FirebaseMessagingPlatform.onBackgroundMessage= (包:firebase_messaging_platform_interface/src/platform_interface/platform_interface_messaging.dart:108:16)

// Background Messaging Set Up
    Future<void> _firebaseMessagingBackgroundHandler(
        RemoteMessage message) async 
      print('background message');
    

    FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
    runApp(....)

我在 android 系统上收到此代码错误。除非应用程序终止,否则一切正常。

适用于 Android 的功能:

终止、onBackground 和 onForeground 时的通知 仅在前台显示日期

什么在 Android 上不起作用:

仅在 Terminated 和 onBackground 时提供数据

适用于 iOS 的功能:

终止、onBackground 和 onForeground 时的通知 仅在前台显示日期

什么在 iOS 上不起作用:

仅在终止时提供数据,

我不知道为什么我会在 Android 系统上收到空值错误,我该如何解决这个问题?另外,当应用终止时,我在ios上收不到Data only推送通知是真的吗?

【问题讨论】:

【参考方案1】:

我和你一样的错误,在同一行。我查看了docs,它说明了有关后台消息处理程序的两件事。

    不能是匿名函数。 它必须是***函数(例如,不是需要初始化的类方法)。

在我的例子中,它不是一个***函数,它是在一个类中声明的。当您将处理程序从任何类或函数中移出,使其成为***函数并且不需要任何类或方法初始化时,错误就会消失。

【讨论】:

top-level 函数是我的愚蠢 -> 把它放在类的顶部。【参考方案2】:

_firebaseMessagingBackgroundHandler 函数应该在主函数之外。

Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async 
  await Firebase.initializeApp();



Future<void> main() async 

  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);


  runApp(
    ...
  );

【讨论】:

对。当我读到top-level 时,我认为我必须把它放在类或函数的顶部。我意识到这意味着OUTSIDE 是的,放在外面:)【参考方案3】:

就我而言,按照文档所说的去做是不够的。所以我意识到我应该在 main 函数的所有内容之前添加WidgetsFlutterBinding.ensureInitialized(),如下所示:

void main() 
  WidgetsFlutterBinding.ensureInitialized();
  FirebaseMessaging.onBackgroundMessage(_handleMessage);
  runApp(const Homino());

【讨论】:

以上是关于Flutter:FCM未处理异常:空值检查运算符用于空值的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤振发布方法中修复“未处理的异常:用于空值的空检查运算符”

用于空值 Flutter 的空值检查运算符

Flutter Bloc Test:空值检查运算符用于空值(空安全)

Flutter 2.0.2 Null 检查运算符用于空值

未处理的异常:MissingPluginException(未找到对通道 plugins.flutter.io/connectivity 进行方法检查的实现)

颤振错误,对空值使用空检查运算符