Firebase用户名密码认证遇NullPointerException及Gradle问题求助
首先明确回答:你的Gradle配置错误确实会直接导致Firebase认证时的NullPointerException。因为如果Gradle同步失败、依赖无法正确解析,Firebase SDK根本无法完成初始化,最终导致FirebaseAuth实例为null,调用signInWithCredential方法时自然会抛出空指针异常。下面分两部分帮你解决问题:
一、先修复Gradle配置错误
你的Gradle代码出现Cannot resolve symbol "Properties"和Cannot resolve Symbol "GradleException",以及没有同步按钮的问题,按以下步骤排查:
修正
GradleException的写法
在较新版本的Gradle(7.0+)中,GradleException需要使用全限定类名,或者替换为RuntimeException(Flutter项目推荐后者)。修改你的代码:def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { localPropertiesFile.withReader('UTF-8') { reader -> localProperties.load(reader) } } def flutterRoot = localProperties.getProperty('flutter.sdk') if (flutterRoot == null) { // 替换原来的GradleException throw new RuntimeException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") }解决
Properties无法解析的问题- 确认你的
local.properties文件存在于项目根目录,如果不存在,手动创建一个,内容至少包含:flutter.sdk=/path/to/your/flutter/sdk - 尝试手动触发Gradle同步:
- 在Android Studio中,点击顶部菜单栏的
File -> Sync Project with Gradle Files - 如果没有找到这个选项,打开终端执行
flutter pub get(Flutter项目会自动同步Gradle依赖)
- 在Android Studio中,点击顶部菜单栏的
- 确认你的
检查Gradle版本兼容性
确保你的项目级build.gradle中的Android Gradle Plugin(AGP)和Gradle版本匹配,比如:buildscript { ext.kotlin_version = '1.9.0' repositories { google() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:7.4.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.gms:google-services:4.4.0' // Firebase必需的插件 } }对应的Gradle版本(在
gradle/wrapper/gradle-wrapper.properties中):distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
二、修复Firebase Auth的NullPointerException
当Gradle配置修复完成后,再确保Firebase初始化正确:
验证Google Services配置
- 从Firebase控制台下载最新的
google-services.json文件,放在android/app目录下 - 确保app级
build.gradle末尾添加了Google Services插件:apply plugin: 'com.google.gms.google-services'
- 从Firebase控制台下载最新的
确保FirebaseAuth实例正确获取
在调用认证方法前,确保FirebaseAuth实例不为null,推荐在初始化时获取:// Flutter代码示例 final FirebaseAuth _auth = FirebaseAuth.instance; // 登录方法 Future<UserCredential> signInWithEmailPassword(String email, String password) async { try { final UserCredential userCredential = await _auth.signInWithEmailAndPassword( email: email, password: password, ); return userCredential; } catch (e) { print(e.toString()); rethrow; } }检查Firebase认证方式是否启用
再次确认Firebase控制台中,用户名/密码认证已经被启用,并且你创建的用户账号状态正常(没有被禁用)。
总结
先优先解决Gradle的配置错误,因为这是导致Firebase SDK无法初始化的根本原因。当Gradle同步成功、依赖解析完成后,FirebaseAuth实例就能正常创建,空指针问题也会随之解决。
内容的提问来源于stack exchange,提问作者thecode

