【问题标题】:Flutter: FCM Unhandled Exception: Null check operator used on a null valueFlutter:FCM未处理异常:空值检查运算符用于空值
【发布时间】: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推送通知是真的吗?

【问题讨论】:

    标签: flutter push-notification firebase-cloud-messaging


    【解决方案1】:

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

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

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

    【讨论】:

    • 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());
    }
    

    【讨论】:

      猜你喜欢
      • 2021-08-19
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2022-10-19
      相关资源
      最近更新 更多