Flutter Firebase 和 Android 问题 - 无法初始化。找不到执行了最新(2020 年 9 月)迁移说明的 google-services.json
Flutter Firebase and Android issue - unable to initialise. Cannot find google-services.json with latest (sept 2020) migration instructions executed
我是一名 Flutter 开发人员,在过去的两天里,我一直在努力让我的应用程序为 Android.这是一个相当大的应用程序,具有许多不同的功能(主要是 google 地图和 firebase),在 iOS 上运行得非常好。但是,现在我正在尝试让 Android 部分正常工作,但由于某些 Firebase 问题,我似乎根本无法启动该应用程序。
FlutterFire 负责大多数 Firebase 软件包,他们刚刚发布了几个 更新。我花了很多时间重构我的项目以适应大多数重大变化。我面临的问题与新更新有关。不幸的是,我遇到的错误并没有让我更接近解决方案。我认为这与无法找到 google-services.json 的 Android 部分有关。正如我提到的,在 iOS 上一切正常。所以我的逻辑结论是 Flutter 代码也很好。 Google/Whosebug/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):
到目前为止我做了以下事情:
- 已在 https://firebase.flutter.dev/docs/migration/ 上遵循 迁移说明 。
- 将我的 google-services.json 放在 android/app 以及 android/app/src/main 中,android/app/src/profile 和 android/app/src/debug(我知道后 3 个不是必需的,但我看到它被提到过几次)。
- 确保在调用 await Firebase.initalizeApp().[=83 之前调用 WidgetsFlutterBinding.ensureInitialized() =]
- 确保在调用 runApp().
之前调用 Firebase.initializeApp()
- 在我的 pubspec.yaml and/or 我的 应用程序 和 app build.gradle.
- 无数次克制自己没有把好旧的笔记本电脑扔出window。
即使我删除了所有代码并让我的应用只剩下以下代码,我仍然会遇到同样的错误。
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
我的app/build.gradle有以下配置:
compileSdkVersion 29
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
lintOptions {
disable 'InvalidPackage'
}
defaultConfig {
applicationId "Whosebug.example.package"
minSdkVersion 21
targetSdkVersion 29
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
}
以及以下依赖项:
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'
}
我应用了以下插件:
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"
我的 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'
}
我也更新了我的 google-services.json 多次从 Firebase 下载最新版本,但这也没有帮助。我觉得没有看到其他人有这个问题很奇怪。我希望你们中的任何人都能弄清楚发生了什么。非常感谢。
更新:我在build.gradle中删除并添加了几个依赖项(即使迁移指南说要全部删除它们,但这并不't always work) 并将 android 项目恢复为 Java 而不是 Kotlin。这允许以更好的方式重新配置一些 firebase 消息传递。这似乎改变了一些东西,但仍然给我某种 Firebase 初始化错误。
[错误:flutter/lib/ui/ui_dart_state.cc(166)] 未处理的异常:MissingPluginException(未在通道 plugins.flutter.io/firebase_core 上找到方法 Firebase#initializeCore 的实现)
解决这个问题我才睡觉♞
更新 2:我最终创建了一个新项目,仔细地从原始项目中复制了 firebase 和多个其他包。之后,我复制了 lib/android 中的每个文件以及它们在 build.gradle 和清单中的各自配置。对于 iOS,我只是复制了整个项目并立即运行。
'new' 项目现在似乎一切正常。仍然完全不确定罪魁祸首是什么,因为我已经将确切的项目复制到一个新项目中。无论如何希望这可以帮助任何人解决这个问题。浪费了五天时间,祝你不一样
穆罕默德在下面的回答似乎也帮助了很多人,最后尝试我的解决方案。
我看到太多可能不对的地方。
我不确定第 4 步(确保我在调用 runApp() 之前调用 Firebase.initializeApp()),在我的例子中,我在 runapp.
之后初始化了 firebase
void main() {
initializeDateFormatting().then((_) => runApp(MyApp()));
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FutureBuilder(
// Initialize FlutterFire
future: Firebase.initializeApp(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
我看到的另一件事是link你post,我建议你再读一遍,在某些地方它说:
确保您不是在您的android/app/build.gradle文件依赖项{.. 。 } 部分。
例如删除任何类似于以下内容的行:implementation 'com.google.firebase:firebase-{PRODUCT}:{VERSION}
这是我在您的 build.gradle 依赖项中看到的东西。
你的 gradle 和我的太不一样了,更接近于 Android Studio 中启动应用程序的原始版本。
希望对您有所帮助。
我有那个问题。当我在 gradle 中添加应用插件:'com.google.gms.google-services' 时,它开始工作了。
经过几个小时的努力,我找到了解决方案。
- 首先,添加 'google-services' 插件作为依赖
android/build.gradle 文件:
buildscript {
dependencies {
// ... other dependencies
classpath 'com.google.gms:google-services:4.3.3'
}
}
- 最后,通过在
/android/app/build.gradle
文件中的 apply plugin: 'com.android.application' 行下方添加以下内容来执行插件:
apply plugin: 'com.google.gms.google-services'
为Android建设#
打开 /android/app/build.gradle
文件。在 dependencies 下添加 multidex 模块,并在 defaultConfig 中启用它:
android {
defaultConfig {
// ...
minSdkVersion 16
targetSdkVersion 28
multiDexEnabled true
}
}
dependencies {
implementation 'com.android.support:multidex:1.0.3'
}
- 从 firebase 下载
google-services.json
文件
- 将 google-services 插件添加到您的
app/build.gradle
文件中:
dependencies { classpath 'com.google.gms:google-services:4.3.4' // ... }
- 在
android/build.gradle
上面添加apply plugin: 'com.google.gms.google-services'
android { //... }
参考:https://developers.google.com/android/guides/google-services-plugin
请将 firebase 核心依赖项更新为 firebase_core: "0.5.2+1"
之后,我添加了
WidgetsFlutterBinding.ensureInitialized();
Firebase.initializeApp();
runApp(MaterialApp(debugShowCheckedModeBanner: false, home: MyApp()));
在主要方法中
并更新项目和应用程序目录中 build.gaddle 中的所有内容。
我按照这些步骤(Brian 和 Muhammed 上面说的)执行
flutter build apk --debug
flutter build apk --profile
flutter build apk --release
然后,运行 应用程序!它对我有用!
只需使缓存无效并重新启动 Android Studio
没有向我提供同步 gradle 文件的可能性(如 Google 文档所述),所以我怀疑这与旧的 gradle 文件有些关系由应用程序使用。
我用文件->使缓存无效并重新启动解决了这个问题。
根据经验,在 IT 领域,重启可以解决 50% 的问题。
就我个人而言,@MuhammadAmjad 的回答向我展示了应用程序级别的 gradle 文件中缺少的一行。具体来说,我错过了以下内容:
apply plugin: 'com.google.gms.google-services'
我不确定这是怎么发生的,但是 Google 用于安装 Firebase 的另一个页面缺少此详细信息。我建议遇到此问题的人尽快查看这是否是罪魁祸首,以防他们遇到与我相同的问题,这会节省他们很多时间。再次感谢@MuhammadAmjad.
我也在解决这个问题,我遵循了 Brian 的解决方案,但它不适合我。然后我将我的 Gradle 包装器版本从 6.8.3 降级到 6.5,我的应用程序开始正常工作。
所以我的建议是遵循 Brian 的回答,如果它对您不起作用,请尝试降级或升级您的 Gradle 版本。
添加依赖项
classpath 'com.google.gms:google-services:4.3.8'
project/build.gradle
然后添加应用插件
apply plugin: 'com.google.gms.google-services'
您可以将其粘贴在底部或与其他应用插件一起粘贴。
project/android/app/build.gradle
这个对我有用。
如果在您完成所有依赖项后仍无法运行,从模拟器中删除该应用程序。然后在 firebase 的同一个项目中创建一个新的应用程序。重复这些步骤。重新安装应用程序。我的问题就这样解决了。
在使用任何 Firebase 服务之前,需要对 FlutterFire 进行初始化。
执行以下命令并按照说明操作:
# Install the CLI if not already done so
dart pub global activate flutterfire_cli
# Run the `configure` command, select a Firebase project and platforms
flutterfire configure
首先导入firebase_core插件并生成firebase_options.dart文件:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform, //This line is necessary
);
runApp(MyApp());
}
DefaultFirebaseOptions.currentPlatform 是从我们生成的 firebase_options.dart 文件导入的。
我是一名 Flutter 开发人员,在过去的两天里,我一直在努力让我的应用程序为 Android.这是一个相当大的应用程序,具有许多不同的功能(主要是 google 地图和 firebase),在 iOS 上运行得非常好。但是,现在我正在尝试让 Android 部分正常工作,但由于某些 Firebase 问题,我似乎根本无法启动该应用程序。
FlutterFire 负责大多数 Firebase 软件包,他们刚刚发布了几个 更新。我花了很多时间重构我的项目以适应大多数重大变化。我面临的问题与新更新有关。不幸的是,我遇到的错误并没有让我更接近解决方案。我认为这与无法找到 google-services.json 的 Android 部分有关。正如我提到的,在 iOS 上一切正常。所以我的逻辑结论是 Flutter 代码也很好。 Google/Whosebug/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):
到目前为止我做了以下事情:
- 已在 https://firebase.flutter.dev/docs/migration/ 上遵循 迁移说明 。
- 将我的 google-services.json 放在 android/app 以及 android/app/src/main 中,android/app/src/profile 和 android/app/src/debug(我知道后 3 个不是必需的,但我看到它被提到过几次)。
- 确保在调用 await Firebase.initalizeApp().[=83 之前调用 WidgetsFlutterBinding.ensureInitialized() =]
- 确保在调用 runApp(). 之前调用 Firebase.initializeApp()
- 在我的 pubspec.yaml and/or 我的 应用程序 和 app build.gradle.
- 无数次克制自己没有把好旧的笔记本电脑扔出window。
即使我删除了所有代码并让我的应用只剩下以下代码,我仍然会遇到同样的错误。
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
我的app/build.gradle有以下配置:
compileSdkVersion 29
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
lintOptions {
disable 'InvalidPackage'
}
defaultConfig {
applicationId "Whosebug.example.package"
minSdkVersion 21
targetSdkVersion 29
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
}
以及以下依赖项:
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'
}
我应用了以下插件:
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"
我的 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'
}
我也更新了我的 google-services.json 多次从 Firebase 下载最新版本,但这也没有帮助。我觉得没有看到其他人有这个问题很奇怪。我希望你们中的任何人都能弄清楚发生了什么。非常感谢。
更新:我在build.gradle中删除并添加了几个依赖项(即使迁移指南说要全部删除它们,但这并不't always work) 并将 android 项目恢复为 Java 而不是 Kotlin。这允许以更好的方式重新配置一些 firebase 消息传递。这似乎改变了一些东西,但仍然给我某种 Firebase 初始化错误。 [错误:flutter/lib/ui/ui_dart_state.cc(166)] 未处理的异常:MissingPluginException(未在通道 plugins.flutter.io/firebase_core 上找到方法 Firebase#initializeCore 的实现) 解决这个问题我才睡觉♞
更新 2:我最终创建了一个新项目,仔细地从原始项目中复制了 firebase 和多个其他包。之后,我复制了 lib/android 中的每个文件以及它们在 build.gradle 和清单中的各自配置。对于 iOS,我只是复制了整个项目并立即运行。 'new' 项目现在似乎一切正常。仍然完全不确定罪魁祸首是什么,因为我已经将确切的项目复制到一个新项目中。无论如何希望这可以帮助任何人解决这个问题。浪费了五天时间,祝你不一样
穆罕默德在下面的回答似乎也帮助了很多人,最后尝试我的解决方案。
我看到太多可能不对的地方。 我不确定第 4 步(确保我在调用 runApp() 之前调用 Firebase.initializeApp()),在我的例子中,我在 runapp.
之后初始化了 firebasevoid main() {
initializeDateFormatting().then((_) => runApp(MyApp()));
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FutureBuilder(
// Initialize FlutterFire
future: Firebase.initializeApp(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
我看到的另一件事是link你post,我建议你再读一遍,在某些地方它说:
确保您不是在您的android/app/build.gradle文件依赖项{.. 。 } 部分。 例如删除任何类似于以下内容的行:implementation 'com.google.firebase:firebase-{PRODUCT}:{VERSION}
这是我在您的 build.gradle 依赖项中看到的东西。 你的 gradle 和我的太不一样了,更接近于 Android Studio 中启动应用程序的原始版本。
希望对您有所帮助。
我有那个问题。当我在 gradle 中添加应用插件:'com.google.gms.google-services' 时,它开始工作了。
经过几个小时的努力,我找到了解决方案。
- 首先,添加 'google-services' 插件作为依赖 android/build.gradle 文件:
buildscript {
dependencies {
// ... other dependencies
classpath 'com.google.gms:google-services:4.3.3'
}
}
- 最后,通过在
/android/app/build.gradle
文件中的 apply plugin: 'com.android.application' 行下方添加以下内容来执行插件:
apply plugin: 'com.google.gms.google-services'
为Android建设#
打开 /android/app/build.gradle
文件。在 dependencies 下添加 multidex 模块,并在 defaultConfig 中启用它:
android {
defaultConfig {
// ...
minSdkVersion 16
targetSdkVersion 28
multiDexEnabled true
}
}
dependencies {
implementation 'com.android.support:multidex:1.0.3'
}
- 从 firebase 下载
google-services.json
文件 - 将 google-services 插件添加到您的
app/build.gradle
文件中:dependencies { classpath 'com.google.gms:google-services:4.3.4' // ... }
- 在
android/build.gradle
上面添加apply plugin: 'com.google.gms.google-services'
android { //... }
参考:https://developers.google.com/android/guides/google-services-plugin
请将 firebase 核心依赖项更新为
firebase_core: "0.5.2+1"
之后,我添加了WidgetsFlutterBinding.ensureInitialized(); Firebase.initializeApp(); runApp(MaterialApp(debugShowCheckedModeBanner: false, home: MyApp()));
在主要方法中
并更新项目和应用程序目录中 build.gaddle 中的所有内容。
我按照这些步骤(Brian 和 Muhammed 上面说的)执行
flutter build apk --debug
flutter build apk --profile
flutter build apk --release
然后,运行 应用程序!它对我有用!
只需使缓存无效并重新启动 Android Studio
没有向我提供同步 gradle 文件的可能性(如 Google 文档所述),所以我怀疑这与旧的 gradle 文件有些关系由应用程序使用。
我用文件->使缓存无效并重新启动解决了这个问题。
根据经验,在 IT 领域,重启可以解决 50% 的问题。
就我个人而言,@MuhammadAmjad 的回答向我展示了应用程序级别的 gradle 文件中缺少的一行。具体来说,我错过了以下内容:
apply plugin: 'com.google.gms.google-services'
我不确定这是怎么发生的,但是 Google 用于安装 Firebase 的另一个页面缺少此详细信息。我建议遇到此问题的人尽快查看这是否是罪魁祸首,以防他们遇到与我相同的问题,这会节省他们很多时间。再次感谢@MuhammadAmjad.
我也在解决这个问题,我遵循了 Brian 的解决方案,但它不适合我。然后我将我的 Gradle 包装器版本从 6.8.3 降级到 6.5,我的应用程序开始正常工作。
所以我的建议是遵循 Brian 的回答,如果它对您不起作用,请尝试降级或升级您的 Gradle 版本。
添加依赖项
classpath 'com.google.gms:google-services:4.3.8'
project/build.gradle
然后添加应用插件
apply plugin: 'com.google.gms.google-services'
您可以将其粘贴在底部或与其他应用插件一起粘贴。
project/android/app/build.gradle
这个对我有用。
如果在您完成所有依赖项后仍无法运行,从模拟器中删除该应用程序。然后在 firebase 的同一个项目中创建一个新的应用程序。重复这些步骤。重新安装应用程序。我的问题就这样解决了。
在使用任何 Firebase 服务之前,需要对 FlutterFire 进行初始化。 执行以下命令并按照说明操作:
# Install the CLI if not already done so
dart pub global activate flutterfire_cli
# Run the `configure` command, select a Firebase project and platforms
flutterfire configure
首先导入firebase_core插件并生成firebase_options.dart文件:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform, //This line is necessary
);
runApp(MyApp());
}
DefaultFirebaseOptions.currentPlatform 是从我们生成的 firebase_options.dart 文件导入的。