Flutter开发中如何将Firebase Document ID传递到更新页以修改数据
问题解决方案
核心问题是跳转更新页时没有将当前任务的document.id作为参数传递给目标页面,按以下步骤修改即可正常实现更新逻辑:
步骤1:修改UpdateStatusPage增加接收参数的构造函数
给更新页组件新增必传的文档ID参数,还可以新增原有任务内容的可选参数,方便编辑时直接回显内容,减少用户操作成本:
class UpdateStatusPage extends StatefulWidget { // 必传参数:当前要编辑的任务文档ID final String documentId; // 可选参数:原有任务内容,用于编辑页回显 final String? oldBaslik; final String? oldIcerik; const UpdateStatusPage({ super.key, required this.documentId, this.oldBaslik, this.oldIcerik, }); @override State<UpdateStatusPage> createState() => _UpdateStatusPageState(); }
在更新页的initState生命周期里给控制器赋值,实现原有内容回显:
class _UpdateStatusPageState extends State<UpdateStatusPage> { final gorevBaslikController = TextEditingController(); final gorevIcerikController = TextEditingController(); @override void initState() { super.initState(); // 回显原有任务内容 if(widget.oldBaslik != null){ gorevBaslikController.text = widget.oldBaslik!; } if(widget.oldIcerik != null){ gorevIcerikController.text = widget.oldIcerik!; } } // 其余原有代码保持不变 }
步骤2:修改列表页跳转逻辑,传递参数
找到列表页编辑按钮的跳转逻辑,把当前遍历到的文档ID和内容传递给更新页:
IconButton( icon: Icon(Icons.edit), onPressed: () async { await Navigator.push( context, MaterialPageRoute( builder: (context) => UpdateStatusPage( documentId: document.id, oldBaslik: data['GorevBaslik'], oldIcerik: data['GorevIcerik'], ) ) ); }),
步骤3:修复更新页的更新逻辑
这里需要同时修复两处原有代码的问题:
- 用传递过来的
widget.documentId替换原本不存在的document.id - 提交更新时要取控制器的
text属性,不要直接传控制器对象,否则会存储控制器的内存地址而非输入内容
ElevatedButton( onPressed: (){ firestore .collection('Task') .doc('${auth.currentUser?.email}') .collection('tasks') // 使用传递过来的文档ID .doc(widget.documentId) .update( { // 取控制器的text属性获取输入内容 'GorevBaslik': gorevBaslikController.text, 'GorevIcerik': gorevIcerikController.text, } ).then((value) => Navigator.pop(context)); // 更新完成后自动返回列表页 }, child: Text( "Güncelle", style: TextStyle(color: Colors.white), ), ),
内容的提问来源于stack exchange,提问作者notdeveloper
相关产品推荐
相关产品推荐

