Flutter使用Datatable时如何正确更新Firebase指定字段
问题原因
更新错数据的核心问题有三个:
- 提交更新时使用了
FirebaseAuth.instance.currentUser!.uid作为待更新文档的ID,这个ID是当前登录系统的用户自己的账号ID,和你点击选中的表格行对应的用户ID完全无关,自然会更新到错误的文档。 - 整个流程没有存储选中行对应的用户唯一ID(uid),提交时根本找不到要更新的目标条目。
- 行点击回调逻辑顺序错误:先弹出编辑弹窗,才给输入框控制器赋值,可能出现弹窗内初始值加载异常。
修复方案
1. 新增选中条目ID存储变量
在页面状态类中增加变量,专门存当前要编辑的用户ID:
class _UsersPageState extends State<UsersPage> { final nameController = TextEditingController(); // 新增:存储选中待编辑用户的uid String? _selectedUserId;
2. 修正行点击回调逻辑
调整onTabRow的执行顺序,先拿到选中行的用户ID、给输入框赋初始值,再弹出编辑弹窗:
onTabRow: (data){ // 先存选中用户ID、填充输入框初始值 _selectedUserId = data['uid']; nameController.text = data['name']; // 最后弹出编辑窗 updateUserDialog(context); print(data); },
3. 修正提交更新逻辑
替换弹窗内提交按钮的点击逻辑,使用选中的用户ID更新对应Firebase文档,操作完成后关闭弹窗、刷新表格数据:
ElevatedButton( onPressed: () async { // 未获取到选中用户ID时直接返回,避免报错 if(_selectedUserId == null) return; final newName = nameController.text.trim(); final db = FirebaseFirestore.instance; // 用选中条目的uid定位要更新的文档,不再误用当前登录用户ID await db.collection('users').doc(_selectedUserId).update({ 'navn': newName, }); // 重置状态、关闭弹窗、刷新表格数据 nameController.clear(); _selectedUserId = null; Navigator.of(context).pop(); // 重新拉取数据刷新表格显示 Provider.of<UserTableProvider>(context, listen: false).mockPullData(); }, child: const Text('Save') )
4. 其他必要修复
- 删掉编辑弹窗内
TextField下重复粘贴的enabledBorder、border配置,避免代码冗余报错。 - 增加控制器释放逻辑,避免内存泄漏:
@override void dispose() { nameController.dispose(); super.dispose(); }
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

