Flutter使用Firebase Auth登录报错NoSuchMethodError: login方法调用在null对象上
问题根因
- 核心错误:LoginPage错误重写了
setState方法,没有使用页面初始化生命周期initState。setState仅在手动触发状态更新时才会执行,页面首次加载时不会走你写的setState内部逻辑,因此_con.init(context)从未执行,LoginController中的_authProvider变量始终为null,调用它的login方法就触发了空指针异常,和你贴的运行日志报错完全匹配。 - 次要隐患:AuthProvider代码存在语法错误,catch块中获取错误码用了大写开头的
error.Code,FirebaseAuth异常的错误码属性实际是小写的error.code,同时errorMessage未初始化可空标记,后续判断可能出现异常。
修复步骤
1. 修正LoginPage生命周期方法
删除原来重写的setState代码块,替换为标准的initState实现:
@override void initState() { super.initState(); SchedulerBinding.instance.addPostFrameCallback((timeStamp) { _con.init(context); }); }
2. 修正AuthProvider代码隐患
修改login方法的异常处理逻辑:
Future<bool> login(String email ,String password)async{ String? errorMessage; // 声明为可空类型,默认值为null try{ await _firebaseAuth.signInWithEmailAndPassword(email: email, password: password); }catch(error){ print(error); errorMessage = (error as FirebaseAuthException).code; // 正确获取错误码 } if(errorMessage != null){ return Future.error(errorMessage); } return true; }
3. 可选优化
给LoginController的_authProvider加late修饰符,明确告知编译器该变量会在使用前初始化,避免编译警告:
late AuthProvider _authProvider;
修改完成后重新运行项目即可正常调用Firebase登录逻辑,不会再出现空指针错误。
内容的提问来源于stack exchange,提问作者Ahmed Alqasim
相关产品推荐
相关产品推荐

