firebase_messaging flutter plugin crashing on startup if handling background messages
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
Comments
-
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()
ininitState
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 inFirebaseMessaging.configure
method.