Flutter中如何将包含Map类型用户姓名的用户数据存入Cloud Firestore?
解决方法与代码优化建议
我来帮你搞定注册时的name参数填充问题,同时给你梳理代码里可以优化的点:
1. 填充User的name参数
首先你需要为用户的名和姓分别设置输入控制器(比如firstNameController和lastNameController),用来获取用户输入的名字信息。然后在创建User实例时,通过这两个控制器的文本值初始化Name对象即可,修改后的注册按钮逻辑如下:
onPressed: (() async { if (_formKey.currentState!.validate()) { DatabaseService service = DatabaseService(); // 创建Name实例并传入User User user = User( email: emailController.text, password: passwordController.text, phoneNumber: phoneNumberController.text, name: Name( firstName: firstNameController.text, lastName: lastNameController.text, ), ); setState(() { _isLoading = true; }); await service.addUser(user); setState(() { _isLoading = false; }); } }),
2. 代码错误与优化建议
(1)移除冗余的docId存储
Firestore的add()方法会自动生成文档ID,这个ID可以通过返回的DocumentReference的id属性获取,不需要手动把docId存入Firestore文档。你需要修改User模型的toMap()方法,去掉多余的'docId'字段:
Map<String, dynamic> toMap() => { 'email': email, 'password': password, 'phoneNumber': phoneNumber, 'name': name.toMap(), };
(2)优化addUser方法获取自动生成的docId
如果后续需要对用户数据进行更新操作,可以在addUser方法中获取Firestore生成的文档ID,返回给调用方或者赋值给User实例,修改后的方法如下:
Future<User> addUser(User userData) async { DocumentReference docRef = await _firestore.collection('users').add(userData.toMap()); // 返回包含自动生成docId的User实例 return User( docId: docRef.id, email: userData.email, password: userData.password, phoneNumber: userData.phoneNumber, name: userData.name, ); }
(3)密码安全优化
重点提醒:当前代码是明文存储用户密码到Firestore,这存在极大的安全风险。建议使用哈希算法(比如SHA-256)对密码加密后再存储,或者直接使用Firebase Authentication来管理用户身份,避免手动处理密码存储。
内容的提问来源于stack exchange,提问作者Monster Eat
相关产品推荐
相关产品推荐

