Flutter接入Firebase Auth实现登录时报空安全错误如何解决?
问题原因
你遇到的三个报错均是Dart空安全机制的强制校验导致的,和你传入的参数实际值无关,是signIn方法的定义不符合空安全要求。
解决步骤
- 修复参数空安全问题
你定义signIn方法时用了可选命名参数{String email, String password},但没有标记为必填,Dart默认可选命名参数的默认值为null,和你声明的非空String类型冲突。只要给两个参数加上required关键字,标记为必填参数即可。 - 修复返回值空安全问题
你声明方法返回值为Future<String>,但现有代码只覆盖了两种FirebaseAuthException的返回场景:
- 如果抛出的
FirebaseAuthException不属于你列的两种错误码,方法就没有返回值 - 如果抛出了
FirebaseAuthException之外的其他异常,也会没有返回值
两种情况都会导致方法隐式返回null,违反非空返回的要求。你可以选择兜底返回通用错误提示,或者把返回值改为可空类型Future<String?>。
修改后的完整代码
import 'package:flutter/material.dart'; import 'package:firebase_auth/firebase_auth.dart'; // 注意你原来的代码漏了这个导入 class AuthClass { final FirebaseAuth auth = FirebaseAuth.instance; Future<String> signIn({required String email, required String password}) async { try { await auth.signInWithEmailAndPassword( email: email, password: password ); return "Welcome!"; } on FirebaseAuthException catch (e) { if (e.code == 'user-not-found') { return 'No user found for that email.'; } else if (e.code == 'wrong-password') { return 'Wrong password provided for that user.'; } // 兜底其他Firebase认证异常 return e.message ?? "登录失败,请稍后重试"; } catch (e) { // 兜底其他所有异常 return "未知错误,登录失败"; } } }
修改完成后你的调用代码不需要做任何改动,即可正常运行。
内容的提问来源于stack exchange,提问作者Matthew Niculae
相关产品推荐
相关产品推荐

