如何解决Flutter Firebase Auth代码中(Id: user.uid)相关报错
Flutter Firebase Auth 报错修复方案
核心错误点
- 构造函数参数不匹配:你在
users.dart中定义的UserModel是位置参数构造函数,但调用时使用了命名参数Id: user.uid,这是触发Id相关报错的直接原因。 - 类型强转错误:
signInWithEmailAndPassword、createUserWithEmailAndPassword返回的是UserCredential类型对象,你直接强转为User会抛出类型转换异常,需要从UserCredential的user属性获取用户实例。 - 语法与逻辑冗余:
_userFromFirebaseUSer方法的入参User已经是非空类型,不需要额外判断user != null,且原return语句末尾缺少分号,会触发语法错误。 - 规范与返回值缺失:登录注册方法参数未声明类型,且定义了Future返回值但没有返回处理结果,逻辑不完整。
修复方案
方案1:保留命名参数调用(和参考教程写法一致)
修改users.dart的UserModel为命名参数构造:
class UserModel{ final String Id; // 改为required命名参数构造 UserModel({required this.Id}); }
方案2:保留现有构造函数写法
修改_userFromFirebaseUSer方法的调用逻辑,改为位置参数传值:
return UserModel(user.uid);
完整修复后的认证服务类代码
import 'package:firebase_auth/firebase_auth.dart'; import 'package:twitter/models/users.dart'; class AuthService{ FirebaseAuth auth = FirebaseAuth.instance; UserModel? _userFromFirebaseUSer(User user){ // 移除冗余的非空判断,补充分号 return UserModel(Id: user.uid); // 若使用方案2这里改为UserModel(user.uid) } // 补充参数类型,明确返回值类型 Future<UserModel?> signIn(String email, String password) async{ try { // 先拿UserCredential,再取user属性 UserCredential credential = await auth.signInWithEmailAndPassword( email: email, password: password ); User? user = credential.user; return user != null ? _userFromFirebaseUSer(user) : null; } on FirebaseAuthException catch (e) { if (e.code == 'weak-password') { print('The password provided is too weak.'); } else if (e.code == 'email-already-in-use') { print('The account already exists for that email.'); } return null; } catch (e) { print(e); return null; } } Future<UserModel?> signUp(String email, String password) async{ try { UserCredential credential = await auth.createUserWithEmailAndPassword( email: email, password: password ); User? user = credential.user; return user != null ? _userFromFirebaseUSer(user) : null; } on FirebaseAuthException catch (e) { if (e.code == 'weak-password') { print('The password provided is too weak.'); } else if (e.code == 'email-already-in-use') { print('The account already exists for that email.'); } return null; } catch (e) { print(e); return null; } } }
内容的提问来源于stack exchange,提问作者user16384788
相关产品推荐
相关产品推荐

