Flutter:User类型无nameController getter错误,求Firestore数据提交正确方式
解决Firestore提交数据的错误并实现正确方法
错误原因
你遇到的The getter "nameController" isn't defined for the type "User"错误,核心问题是:Firebase Auth提供的User类根本没有nameController属性——这个控制器应该是你在注册页面自己定义的TextEditingController实例,用来获取用户输入框的内容,教程里的写法是错误的。
正确实现步骤
1. 在注册页面定义表单控制器
在页面的State类中,声明对应输入框的控制器,并绑定到UI组件:
// 声明控制器 final TextEditingController nameController = TextEditingController(); final TextEditingController emailController = TextEditingController(); final TextEditingController phoneController = TextEditingController(); final TextEditingController provinceController = TextEditingController(); final TextEditingController dobController = TextEditingController(); final TextEditingController passwordController = TextEditingController(); final _formKey = GlobalKey<FormState>(); // 绑定到输入框示例(姓名输入框) TextFormField( controller: nameController, decoration: const InputDecoration(labelText: "姓名"), validator: (value) { if (value == null || value.isEmpty) return "请输入姓名"; return null; }, )
2. 修改Firestore数据提交方法
修正postDataToFirestore方法,直接使用页面内的控制器获取输入值,同时优化异步代码写法:
// 注册方法 void signUp() async { if (_formKey.currentState!.validate()) { try { // 创建Auth用户 UserCredential userCredential = await FirebaseAuth.instance.createUserWithEmailAndPassword( email: emailController.text.trim(), password: passwordController.text.trim(), ); // 提交数据到Firestore await postDataToFirestore(userCredential.user); } catch (e) { Fluttertoast.showToast(msg: e.toString()); } } } // 提交数据到Firestore Future<void> postDataToFirestore(User? user) async { if (user == null) return; FirebaseFirestore firestore = FirebaseFirestore.instance; // 初始化UserModel并赋值 UserModel userModel = UserModel( uid: user.uid, name: nameController.text.trim(), email: user.email, // 直接用Auth返回的邮箱,避免输入不一致 phone: phoneController.text.trim(), province: provinceController.text.trim(), dateOfBirth: dobController.text.trim(), ); // 写入Firestore await firestore.collection("users").doc(user.uid).set(userModel.toMap()); Fluttertoast.showToast(msg: "账号创建成功 :)"); Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: (context) => const HomeScreen()), (route) => false, ); }
3. 关键优化点
- 统一用
async/await替代then,代码逻辑更清晰 - 从
UserCredential直接获取用户对象,比调用_auth.currentUser更可靠(避免异步延迟导致的null问题) - 用
trim()处理输入内容,去除前后无效空格 - 邮箱直接使用Auth返回的
user.email,确保和注册账号一致
内容的提问来源于stack exchange,提问作者editix
相关产品推荐
相关产品推荐

