firebase_messaging flutter plugin crashing on startup if handling background messages

情到浓时终转凉″ 提交于 2020-12-05 12:03:28

问题


I integrated firebase_messaging v5.1.6 with my flutter app as mentioned in README with "handling of background messages" option.

Here are how my files look.

MyApplication.kt

class MyApplication : FlutterApplication(), PluginRegistrantCallback {
    override fun onCreate() {
        super.onCreate()
        FlutterFirebaseMessagingService.setPluginRegistrant(this)
    }

    override fun registerWith(registry: PluginRegistry) {
        GeneratedPluginRegistrant.registerWith(registry)
    }
}

firebase_util.dart

import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:firebase_analytics/observer.dart';
import 'package:firebase_messaging/firebase_messaging.dart';

final kFirebaseAnalyticsObserver =
    FirebaseAnalyticsObserver(analytics: FirebaseUtil().analytics);

Future<dynamic> kFirebaseMessagingBackgroundMessageHandler(
    Map<String, dynamic> message) async {
  if (message.containsKey('data')) {
    // Handle data message
    final dynamic data = message['data'];
  }

  if (message.containsKey('notification')) {
    // Handle notification message
    final dynamic notification = message['notification'];
  }
}

class FirebaseUtil {
  static final FirebaseUtil _firebaseUtil = FirebaseUtil._internal();

  factory FirebaseUtil() {
    return _firebaseUtil;
  }

  FirebaseUtil._internal();

  final analytics = FirebaseAnalytics();
  final messaging = FirebaseMessaging();

  void messagingInit() {
    messaging.requestNotificationPermissions();
    messaging.configure(
      onMessage: (Map<String, dynamic> message) async {
        print("onMessage: $message");
      },
      onBackgroundMessage: kFirebaseMessagingBackgroundMessageHandler,
      onLaunch: (Map<String, dynamic> message) async {
        print("onLaunch: $message");
      },
      onResume: (Map<String, dynamic> message) async {
        print("onResume: $message");
      },
    );
  }
}

I call FirebaseUtil().messagingInit() in initState of the root App widget.

Here is the error log I get when the app is starting up.

E/MethodChannel#plugins.flutter.io/firebase_messaging( 6252): Failed to handle method call
E/MethodChannel#plugins.flutter.io/firebase_messaging( 6252): java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.app.Activity.getApplicationContext()' on a null object reference
E/MethodChannel#plugins.flutter.io/firebase_messaging( 6252):   at com.alternadom.wifiiot.WifiIotPlugin.<init>(WifiIotPlugin.java:65)
E/MethodChannel#plugins.flutter.io/firebase_messaging( 6252):   at com.alternadom.wifiiot.WifiIotPlugin.registerWith(WifiIotPlugin.java:76)
E/MethodChannel#plugins.flutter.io/firebase_messaging( 6252):   at io.flutter.plugins.GeneratedPluginRegistrant.registerWith(GeneratedPluginRegistrant.java:40)
E/MethodChannel#plugins.flutter.io/firebase_messaging( 6252):   at <<package_name>>.MyApplication.registerWith(MyApplication.kt:18)
E/MethodChannel#plugins.flutter.io/firebase_messaging( 6252):   at io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService.startBackgroundIsolate(FlutterFirebaseMessagingService.java:164)
E/MethodChannel#plugins.flutter.io/firebase_messaging( 6252):   at io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin.onMethodCall(FirebaseMessagingPlugin.java:134)
E/MethodChannel#plugins.flutter.io/firebase_messaging( 6252):   at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:222)
E/MethodChannel#plugins.flutter.io/firebase_messaging( 6252):   at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:96)
E/MethodChannel#plugins.flutter.io/firebase_messaging( 6252):   at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:656)
E/MethodChannel#plugins.flutter.io/firebase_messaging( 6252):   at android.os.MessageQueue.nativePollOnce(Native Method)
E/MethodChannel#plugins.flutter.io/firebase_messaging( 6252):   at android.os.MessageQueue.next(MessageQueue.java:326)
E/MethodChannel#plugins.flutter.io/firebase_messaging( 6252):   at android.os.Looper.loop(Looper.java:160)
E/MethodChannel#plugins.flutter.io/firebase_messaging( 6252):   at android.app.ActivityThread.main(ActivityThread.java:6669)
E/MethodChannel#plugins.flutter.io/firebase_messaging( 6252):   at java.lang.reflect.Method.invoke(Native Method)
E/MethodChannel#plugins.flutter.io/firebase_messaging( 6252):   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
E/MethodChannel#plugins.flutter.io/firebase_messaging( 6252):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
...
E/flutter ( 6252): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: PlatformException(error, Attempt to invoke virtual method 'android.content.Context android.app.Activity.getApplicationContext()' on a null object reference, null)
E/flutter ( 6252): #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:569:7)
E/flutter ( 6252): #1      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:316:33)
E/flutter ( 6252): <asynchronous suspension>
E/flutter ( 6252): #2      FirebaseMessaging.configure (package:firebase_messaging/firebase_messaging.dart:118:16)
E/flutter ( 6252): #3      FirebaseUtil.messagingInit (package:<<package_name>>/util/firebase_util.dart:37:15)
E/flutter ( 6252): #4      _MainPageState.initState (package:<<package_name>>/pages/main.dart:29:20)
E/flutter ( 6252): #5      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4068:58)
E/flutter ( 6252): #6      ComponentElement.mount (package:flutter/src/widgets/framework.dart:3919:5)
E/flutter ( 6252): #7      Element.inflateWidget (package:flutter/src/widgets/framework.dart:3101:14)
E/flutter ( 6252): #8      Element.updateChild (package:flutter/src/widgets/framework.dart:2904:12)
E/flutter ( 6252): #9      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3961:16)
E/flutter ( 6252): #10     Element.rebuild (package:flutter/src/widgets/framework.dart:3738:5)
E/flutter ( 6252): #11     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2348:33)
E/flutter ( 6252): #12     WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:760:20)
E/flutter ( 6252): #13     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:280:5)
E/flutter ( 6252): #14     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1033:15)
E/flutter ( 6252): #15     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:975:9)
E/flutter ( 6252): #16     SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:891:5)
E/flutter ( 6252): #17     _rootRun (dart:async/zone.dart:1124:13)
E/flutter ( 6252): #18     _CustomZone.run (dart:async/zone.dart:1021:19)
E/flutter ( 6252): #19     _CustomZone.runGuarded (dart:async/zone.dart:923:7)
E/flutter ( 6252): #20     _invoke (dart:ui/hooks.dart:249:10)
E/flutter ( 6252): #21     _drawFrame (dart:ui/hooks.dart:207:3)

$ flutter doctor -v

[✓] Flutter (Channel stable, v1.9.1+hotfix.2, on Linux, locale en_IN)
    • Flutter version 1.9.1+hotfix.2 at /home/harsh/flutter
    • Framework revision 2d2a1ffec9 (3 weeks ago), 2019-09-06 18:39:49 -0700
    • Engine revision b863200c37
    • Dart version 2.5.0

 [✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
    • Android SDK at /home/harsh/Android/Sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-28, build-tools 28.0.3
    • Java binary at: /home/harsh/android-studio/jre/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
    • All Android licenses accepted.

[✓] Android Studio (version 3.5)
    • Android Studio at /home/harsh/android-studio
    • Flutter plugin version 39.0.3
    • Dart plugin version 191.8423
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)

[✓] Connected device (1 available)
    • Android SDK built for x86 • emulator-5554 • android-x86 • Android 9 (API 28) (emulator)

• No issues found!

I checked the README carefully and checked the implementation. It looks good to me. Don't know what is wrong? Is there any bug in the plugin?

This exact code works if I don't pass onBackgroundMessage argument in FirebaseMessaging.configure method.


回答1:


One of the plugins you are using (in this case WifiIoTPlugin) is throwing a null exception. Mostly, because the plugin is designed for foreground only scenario. firebase_messaging is a plugin that also working in the background, hence that is the conflict.

A similar issue was caused when using android_alarm_manager and google_maps_flutter together as android_alarm_manager.

This issue can be quickly fixed by not registering the plugin when there is no activity. Check this Pull Request which was used to fix the above mentioned issue.

The plugin that is causing the issue (foreground only plugin) code should look something like this:

public static void registerWith(Registrar registrar) {
        if (registrar.activity() == null) {
            // When a background flutter view tries to register the plugin, the registrar has no activity.
            // We stop the registration process as this plugin is foreground only.
            return;
        }
        final ForegroundPlugin foregroundPlugin = new ForegroundPlugin(registrar.activity()); 
        ...
}



回答2:


Yes i think you are right. I think it is a part of this bug.

Android plugin system needs to reimagine how it provides access to Android components #22117

For more reference: https://github.com/flutter/flutter/issues/22117




回答3:


https://stackoverflow.com/a/55036042/7694194 This worked for me for the app startup crash. Add all the plugins you are using explicitly



来源:https://stackoverflow.com/questions/58160625/firebase-messaging-flutter-plugin-crashing-on-startup-if-handling-background-mes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!