You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 00:42:28