Upgrading from my old Flutter v1.12.13+hotfix.5 up to Flutter 1.22.0 stable went mostly like a charm. You should go through the 1.12 migration guide. The problems came after upgrading Firebase dependencies.
firebase_core: ^0.5.0 firebase_auth: ^0.18.1+1 firebase_messaging: ^7.0.2
The very first assembling failed with:
FAILURE: Build failed with an exception. * Where: Build file '/Users/idezhin/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_auth-0.18.1+1/android/build.gradle' line: 54 * What went wrong: A problem occurred evaluating project ':firebase_auth'. > Could not find method platform() for arguments [com.google.firebase:firebase-bom:25.3.1] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.
Update distributionUrl
in android/gradle/wrapper/gradle-wrapper.properties
update.
My old value was https://services.gradle.org/distributions/gradle-4.10.2-all.zip
... distributionUrl=https://services.gradle.org/distributions/gradle-5.4.1-all.zip
After the assembling was stabilised the error occurred during app start-up
E/flutter (24642): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: [core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp() E/flutter (24642): #0 MethodChannelFirebase.app (package:firebase_core_platform_interface/src/method_channel/method_channel_firebase.dart:118:5) E/flutter (24642): #1 Firebase.app (package:firebase_core/src/firebase.dart:52:41) E/flutter (24642): #2 FirebaseAuth.instance (package:firebase_auth/src/firebase_auth.dart:37:47)
“No Firebase App ‘[DEFAULT]’ has been created” is indicating that starting from firebase_core: ^0.5.0
due to internal architecture changes all firebase calls should be preceded with initialization `Firebase.initializeApp()`.
Here is a detailed explanation at StackOverflow.
After initializing firebase properly there was another one:
E/flutter (27772): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: PlatformException(error, PluginRegistrantCallback is not set., null, java.lang.RuntimeException: PluginRegistrantCallback is not set. E/flutter (27772): at io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService.startBackgroundIsolate(FlutterFirebaseMessagingService.java:157) E/flutter (27772): at io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin.onMethodCall(FirebaseMessagingPlugin.java:174) E/flutter (27772): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233) E/flutter (27772): at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:85)
To fix it change (or add) your android/app/src/main/kotlin/%your_package%/Application.kt class.
And add FirebaseCloudMessagingPluginRegistrant.kt.
Many thanks to marwfair who figured it out in an issue thread.
package your_package; import io.flutter.app.FlutterApplication import io.flutter.plugin.common.PluginRegistry import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService class Application : FlutterApplication(), PluginRegistrantCallback { override fun onCreate() { super.onCreate() FlutterFirebaseMessagingService.setPluginRegistrant(this) } override fun registerWith(registry: PluginRegistry) { FirebaseCloudMessagingPluginRegistrant.registerWith(registry) } }
package your_package; import io.flutter.plugin.common.PluginRegistry import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin object FirebaseCloudMessagingPluginRegistrant { fun registerWith(registry: PluginRegistry?) { if (alreadyRegisteredWith(registry)) { return } FirebaseMessagingPlugin.registerWith(registry?.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin")) } private fun alreadyRegisteredWith(registry: PluginRegistry?): Boolean { val key: String? = FirebaseCloudMessagingPluginRegistrant::class.java.canonicalName if (registry?.hasPlugin(key)!!) { return true } registry.registrarFor(key) return false } }
If you’re adding Application.kt file, don’t forget to link it in AndroidManifest.xml cause it is not necessary to have it in Flutter 1.22.
<application android:name=".Application" ... > ... </application>