执行Firebase Auth的signInWithEmailAndPassword时Flutter应用崩溃
解决Flutter Firebase Auth登录崩溃问题(AndroidX冲突+版本不兼容)
兄弟,我一眼就看出你的问题核心是AndroidX与旧Support库的混合冲突,再加上Firebase相关依赖、Gradle版本不匹配,才导致了ArrayMap找不到的致命崩溃。下面一步步帮你搞定:
1. 彻底统一到AndroidX,清理旧Support库
你的项目里同时用了AndroidX的multidex和旧的com.android.support.test测试库,这直接触发了类加载冲突。把应用级build.gradle里的测试依赖全部换成AndroidX版本:
dependencies { testImplementation 'junit:junit:4.12' // 替换成AndroidX的测试库 androidTestImplementation 'androidx.test:runner:1.5.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' implementation 'com.google.firebase:firebase-analytics:17.0.1' implementation 'androidx.multidex:multidex:2.0.1' }
同时,必须在项目根目录的gradle.properties里添加这两行,强制启用AndroidX转换:
android.useAndroidX=true android.enableJetifier=true
2. 升级Gradle插件和Google服务版本
你的Gradle插件(3.2.1)和Google服务(4.2.0)版本太老,和firebase_auth:0.14.0+5完全不兼容。更新项目级build.gradle:
dependencies { // 升级到兼容AndroidX的Gradle插件版本 classpath 'com.android.tools.build:gradle:3.6.4' // 升级Google服务到匹配版本 classpath 'com.google.gms:google-services:4.3.10' }
注意:Gradle插件3.6.4需要对应版本的Gradle,修改gradle/wrapper/gradle-wrapper.properties里的distributionUrl:
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
3. 统一Firebase依赖版本,避免兼容问题
不要用any指定cloud_firestore版本,要和firebase_auth版本匹配。修改pubspec.yaml:
dependencies: flutter: sdk: flutter cloud_firestore: 0.12.10+2 # 和firebase_auth 0.14.0+5完全兼容的版本 firebase_auth: 0.14.0+5
如果还是有依赖冲突,添加版本覆盖:
dependency_overrides: firebase_core: 0.4.4+3
4. 修正应用级build.gradle的测试配置
把测试运行器换成AndroidX版本:
defaultConfig { applicationId "com.example.testtool" minSdkVersion 16 targetSdkVersion 28 versionCode flutterVersionCode.toInteger() versionName flutterVersionName // 替换成AndroidX的测试Runner testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true }
最后:清理缓存并重建项目
做完所有修改后,执行以下操作确保生效:
- 终端运行
flutter clean - 打开Android Studio,点击
File -> Invalidate Caches / Restart - 重新运行项目
另外提一句:你代码里的FirebaseUser在新版Firebase Auth中已经被User替代,虽然当前版本还能用,但以后升级时记得改成:
Future<String> signInWithEmailAndPassword(String email, String password)async{ User user = (await _firebaseAuth.signInWithEmailAndPassword(email: email, password: password)).user; return user.uid; }
内容的提问来源于stack exchange,提问作者David Wild
相关产品推荐
相关产品推荐

