Flutter应用向Firestore提交数据为空问题排查求助
问题排查与修复方案
嘿,我帮你定位到三个核心问题,正是它们导致Firestore只创建字段但值全为null:
1. _saveInput方法错误重声明类级变量
你在提交方法里重新用var声明了_programme、_yearLevel这些变量,这会直接覆盖类级的同名变量,导致你存到Firestore的是未赋值的局部变量,自然全是null。
举个错误代码的例子:
void _saveInput() { var _programme; // 这里重声明了,和类级变量没关系了! var _yearLevel; // ... 其他重声明的变量 FirebaseFirestore.instance.collection('students').add({ 'programme': _programme, 'yearLevel': _yearLevel, // ... }); }
2. _stSemester未关联下拉选择的选中值
你的下拉选择组件没有绑定onChanged回调来更新_stSemester变量,这个变量始终是初始的null,提交时自然传不了正确的选中值。
3. uid未获取当前用户ID
你直接使用uid变量,但没有从Firebase Auth中获取当前登录用户的ID,导致这个值也是null。
修复后的代码示例
咱们一步步来修正:
第一步:正确声明类级变量并初始化用户ID
在你的State类里:
String? _programme; String? _yearLevel; String? _stSemester; // 初始化为null,后续通过下拉框更新 String? uid; @override void initState() { super.initState(); // 获取当前登录用户的ID uid = FirebaseAuth.instance.currentUser?.uid; }
第二步:给下拉框绑定onChanged更新_stSemester
确保下拉选择组件能同步选中值到变量:
DropdownButtonFormField<String>( value: _stSemester, onChanged: (newValue) { setState(() { _stSemester = newValue; // 更新类级变量 }); }, items: ['第一学期', '第二学期'] // 替换成你的实际选项 .map((semester) => DropdownMenuItem( value: semester, child: Text(semester), )) .toList(), decoration: InputDecoration(labelText: '学期'), )
第三步:修正_saveInput方法,移除局部变量重声明
直接使用类级变量提交即可:
void _saveInput() { // 这里不要再用var声明_programe、_yearLevel这些变量! FirebaseFirestore.instance.collection('students').add({ 'programme': _programme, 'yearLevel': _yearLevel, 'semester': _stSemester, 'uid': uid, // ... 其他需要提交的表单字段 }).then((value) { print('数据提交成功!'); // 可以在这里重置表单或者跳转页面 }).catchError((error) { print('提交失败:$error'); }); }
这样修改后,点击提交按钮时,表单的输入值就会正确传递到Firestore里了。
内容的提问来源于stack exchange,提问作者Kennedy Owusu
相关产品推荐
相关产品推荐

