Flutter调用FirebaseAuth.signInWithCredential时应用崩溃求助
解决Flutter Firebase手机认证崩溃及API过时问题
Hey there! Let's work through your Firebase phone auth crash and the outdated API issues together.
核心崩溃原因:AndroidX 兼容性冲突
从错误日志里的java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/util/ArrayMap;可以看出,这是旧Android Support Library和AndroidX的兼容性问题——现在Firebase Auth完全依赖AndroidX,你的项目可能没完成AndroidX迁移或者配置有误。
修复步骤:
- 检查
android/gradle.properties文件,确保添加了以下两行(没有的话加上):
Jetifier会自动将旧的Support Library依赖转换为AndroidX兼容版本。android.useAndroidX=true android.enableJetifier=true - 打开
android/app/build.gradle,确认compileSdkVersion和targetSdkVersion至少为33(匹配最新Firebase依赖的要求):android { compileSdkVersion 33 defaultConfig { targetSdkVersion 33 // ... 其他配置 } } - 清理项目缓存并重新构建:
flutter clean flutter pub get flutter run
修正过时的Firebase Auth API
你提到教程里的方法不再可用,确实Firebase Auth更新了API,以下是正确的写法:
替换旧的Credential获取方式
原来的PhoneAuthProvider.getCredential()已经被弃用,现在用PhoneAuthProvider.credential():
// 正确获取PhoneAuthCredential的写法 final credential = PhoneAuthProvider.credential( verificationId: argVerificationID, smsCode: smsCode, );
替换过时的登录返回类型
AuthResult和FirebaseUser已经被弃用,现在使用UserCredential和User:
// 正确的登录及错误处理代码 try { UserCredential authResult = await FirebaseAuth.instance.signInWithCredential(credential); User? user = authResult.user; // 登录成功,获取用户信息 if (user != null) { print("认证成功!用户ID:${user.uid}"); // 这里可以继续处理用户逻辑,比如跳转首页 } } on FirebaseAuthException catch (e) { // 针对性处理Firebase认证错误 print("错误码:${e.code}"); print("错误信息:${e.message}"); // 如果需要重试,可以使用e.credential获取凭证 } catch (e) { // 处理其他未知错误 print("发生未知错误:$e"); }
额外检查项
- 确保在Firebase控制台的Authentication > Sign-in method里已经启用了Phone认证方式;
- 确认
android/app/google-services.json文件是从Firebase控制台正确下载并放置的; - 在
pubspec.yaml里使用最新的Firebase依赖版本(可以通过flutter pub outdated查看更新):dependencies: firebase_core: ^2.24.2 # Firebase核心依赖,必须添加 firebase_auth: ^4.17.0 # 最新的Firebase Auth版本
内容的提问来源于stack exchange,提问作者Ayu
相关产品推荐
相关产品推荐

