firebase_messaging flutter plugin crashing on startup if handling background messages

5,727

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

Solution 2

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

Solution 3

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

Share:
5,727
Harsh Bhikadia
Author by

Harsh Bhikadia

curious-mind.

Updated on December 14, 2022

Comments

  • Harsh Bhikadia
    Harsh Bhikadia over 1 year

    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.