Flutter Firebase 和 Android 问题 - 无法初始化。找不到执行了最新(2020 年 9 月)迁移指令的 google-services.json

Bri*_*tty 33 android firebase google-play-services flutter flutter-dependencies

我是Flutter开发人员,过去两天我一直在努力让我的应用程序适用于Android。这是一个相当大的应用程序,具有许多不同的功能(主要是谷歌地图和 firebase),可以在 iOS 上完美运行。但是,现在我正在尝试让 Android 部分正常工作,由于某些Firebase问题,我似乎根本无法启动该应用程序。

FlutterFire负责大多数 Firebase 包,他们刚刚发布了一些更新。我花了相当多的时间重构我的项目以符合大多数重大更改。我面临的问题与新更新有关。不幸的是,我遇到的错误并没有让我更接近解决方案。我认为这与无法找到google-services.json的 Android 部分有关。正如我所提到的,在 iOS 上一切正常。所以我的逻辑结论是 Flutter 代码也很好。Google/StackOverflow/FlutterFire 问题似乎都将我误导到对我没有答案的问题。

TL;DR编译到 Android 时,Flutter App 无法启动,因为 Firebase 找不到我的 google-services.json。这是堆栈跟踪:

E/flutter (15568): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: [core/not-initialized] Firebase has not been correctly initialized. Have you added the "google-services.json" file to the project? 
E/flutter (15568):     
E/flutter (15568):     View the Android Installation documentation for more information: https://firebaseextended.github.io/flutterfire/docs/installation/android
E/flutter (15568):     
E/flutter (15568): #0      MethodChannelFirebase.initializeApp (package:firebase_core_platform_interface/src/method_channel/method_channel_firebase.dart:86:9)
E/flutter (15568): <asynchronous suspension>
E/flutter (15568): #1      Firebase.initializeApp (package:firebase_core/src/firebase.dart:43:25)
E/flutter (15568): #2      mainCommon (package:userapp/main/main_common.dart:31:18)
E/flutter (15568): #3      main (package:userapp/main/main_dev.dart:6:9)
E/flutter (15568): #4      _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:233:25)
E/flutter (15568): #5      _rootRun (dart:async/zone.dart:1190:13)
E/flutter (15568): #6      _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter (15568): #7      _runZoned (dart:async/zone.dart:1630:10)
E/flutter (15568): #8      runZonedGuarded (dart:async/zone.dart:1618:12)
E/flutter (15568): #9      _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:225:5)
E/flutter (15568): #10     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
E/flutter (15568): #11     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
E/flutter (15568):
Run Code Online (Sandbox Code Playgroud)

到目前为止,我做了以下几件事:

  1. 按照https://firebase.flutter.dev/docs/migration/上的迁移说明进行操作。
  2. 将我的google-services.json 放在 android/app以及 android/app/src/main、android/app/src/profile 和 android/app/src/debug(我知道后 3 个不是必需的,但我见过它被提到了几次)。
  3. 确保在调用 await Firebase.initalizeApp()之前调用WidgetsFlutterBinding.ensureInitialized ()
  4. 确保在调用runApp()之前调用Firebase.initializeApp ()
  5. 在我的pubspec.yaml和/或我的应用程序应用程序 build.gradle 中使用不同版本的插件重建项目。
  6. 无数次将旧笔记本电脑扔出窗外。

即使我删除了所有代码并只留下以下代码,我的应用程序仍然会遇到相同的错误。

WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
Run Code Online (Sandbox Code Playgroud)

我的app/build.gradle有以下配置:

compileSdkVersion 29

sourceSets {
    main.java.srcDirs += 'src/main/kotlin'
}

lintOptions {
    disable 'InvalidPackage'
}

defaultConfig {
    applicationId "stackoverflow.example.package"
    minSdkVersion 21
    targetSdkVersion 29
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    multiDexEnabled true
}
Run Code Online (Sandbox Code Playgroud)

以及以下依赖项:

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.google.firebase:firebase-messaging:20.2.4'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    implementation 'com.android.support:multidex:2.0.1'
    implementation 'com.google.firebase:firebase-perf:19.0.6'
}
Run Code Online (Sandbox Code Playgroud)

我应用了以下插件:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.firebase-perf'
apply plugin: 'com.google.firebase.crashlytics'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
Run Code Online (Sandbox Code Playgroud)

我的android/build.gradle必须遵循依赖项(我已将这些更新为特定和最新版本,试图解决此问题但没有成功):

dependencies {
    classpath 'com.android.tools.build:gradle:3.5.4'
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.61"
    classpath 'com.google.gms:google-services:4.3.3'
    classpath 'com.google.firebase:perf-plugin:1.3.1'
    classpath 'com.google.firebase:firebase-crashlytics-gradle:2.2.1'
}
Run Code Online (Sandbox Code Playgroud)

我还多次更新了我的 google-services.json 从 Firebase 下载最新版本,但这也没有帮助。我觉得没有看到其他人有这个问题很奇怪。我希望你们中的任何人都能够弄清楚发生了什么。非常感谢。

更新我在 build.gradle 中删除并添加了几个依赖项(即使迁移指南说要删除所有依赖项,但这并不总是有效)并将 android 项目恢复为 Java 而不是 Kotlin。这允许以更好的方式重新配置一些 firebase 消息传递。这似乎改变了一些东西,但仍然给我一些 Firebase 初始化错误。[ERROR:flutter/lib/ui/ui_dart_state.cc(166)] 未处理的异常:MissingPluginException(在频道 plugins.flutter.io/firebase_core 上找不到方法 Firebase#initializeCore 的实现)我不会睡觉直到我解决这个问题?

更新 2:我最终创建了一个新项目,从原始项目中仔细复制了 firebase 和多个其他包。之后,我复制了 lib/android 中的每个文件以及它们在 build.gradle 和 manifests 中各自的配置。对于 iOS,我只是复制了整个项目并且立即生效。现在一切似乎都在“新”项目中工作。仍然完全不确定罪魁祸首是什么,因为我已经将确切的项目复制到了一个新项目。无论如何,希望这可以帮助任何人解决这个问题。我在这上面浪费了五天,我希望你不一样,无论你是谁。

穆罕默德在下面的回答似乎也帮助了很多人,作为最后的手段尝试我的解决方案。

小智 79

经过数小时的斗争,我能够找出解决方案。

  1. 首先,在 android/build.gradle 文件中添加“google-services”插件作为依赖项:
buildscript {
   dependencies {
      // ... other dependencies
      classpath 'com.google.gms:google-services:4.3.3'
   }
}
Run Code Online (Sandbox Code Playgroud)
  1. 最后,通过在文件中的 apply plugin: 'com.android.application' 行下面添加以下内容来执行插件/android/app/build.gradle
apply plugin: 'com.google.gms.google-services'
Run Code Online (Sandbox Code Playgroud)

为 Android 构建# 打开/android/app/build.gradle文件。在依赖项下添加 multidex 模块,并在 defaultConfig 中启用它:

android {
  defaultConfig {
    // ...
    minSdkVersion 16
    targetSdkVersion 28
    multiDexEnabled true
  }
}

dependencies {
   implementation 'com.android.support:multidex:1.0.3'
}
Run Code Online (Sandbox Code Playgroud)

来源:https : //firebase.flutter.dev/docs/installation/android/

  • **非常感谢** 我遵循了文档和其他 Stackoverflow 来源,但这解决了问题。 (4认同)

Nic*_*ist 5

就个人而言,@ MuhammadAmjad的回答显示了我在应用程序级别的 graddle 文件中缺少的一行。具体来说,我错过了以下内容:

apply plugin: 'com.google.gms.google-services'
Run Code Online (Sandbox Code Playgroud)

我不确定这是怎么发生的,但 Google 用于安装 Firebase 的另一个页面缺少此详细信息。我会建议遇到此问题的人尽快查看这是否是罪魁祸首,以防他们与我有同样的问题,这将为他们节省大量时间。再次感谢@MuhammadAmjad