如何校验Firestore数据更新状态并在保存操作后给用户对应提示
实现方案
核心逻辑说明
你原有代码的问题在于点击事件是同步执行的,没有等待Firestore异步更新的执行结果,所以无法感知更新成功或失败。
Firestore的update方法本身是异步Future操作:
- 执行成功时无异常抛出,方法正常返回
- 执行失败(网络异常、权限不足、目标文档不存在、字段校验不通过等)会抛出对应异常
我们只需要等待异步操作完成、捕获异常即可判断更新结果,对应弹出提示即可。
可选方案1:不修改原有数据库层方法,直接在UI层处理
直接修改保存按钮的点击逻辑,增加异步等待和异常捕获:
ElevatedButton( onPressed: () async { try { // 等待更新操作执行完成 await DatabaseService().updateTechnical( Technical( id: selectedTechnical.id, name: nameController.text, address: addressController.text, phoneNum: phoneController.text, tools: selected.join(','), ), ); // 可选:更新成功后弹出成功提示、关闭当前页等操作 } catch (e) { // 更新失败,弹出toast引导重试 // 此处根据你使用的toast组件调整调用方式即可 Toast.show("保存失败,请检查网络后重试", context); } }, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('Save '), Icon(Icons.person_add), ], ), ),
可选方案2:封装数据库层方法返回更新状态,UI层直接判断
先修改updateTechnical方法,封装成功失败状态返回:
Future<bool> updateTechnical(Technical technical) async { try { await technicalsCollection.doc(technical.id).update({ "name": technical.name, "address": technical.address, "phoneNum": technical.phoneNum, "tools": technical.tools, }); // 更新成功返回true return true; } catch (e) { // 可在此打印错误日志方便排查问题 print("更新失败:$e"); // 更新失败返回false return false; } }
再修改按钮点击逻辑:
ElevatedButton( onPressed: () async { bool updateResult = await DatabaseService().updateTechnical( Technical( id: selectedTechnical.id, name: nameController.text, address: addressController.text, phoneNum: phoneController.text, tools: selected.join(','), ), ); if (!updateResult) { Toast.show("保存失败,请重试", context); } }, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('Save '), Icon(Icons.person_add), ], ), ),
额外优化建议
- 可以给按钮增加点击禁用和加载状态,点击保存后显示加载动画,避免用户重复点击提交多次请求
- 可以根据捕获的异常类型细化提示内容,比如权限问题提示无操作权限,网络问题提示检查网络,不需要统一引导重试
内容的提问来源于stack exchange,提问作者FadyFouad
相关产品推荐
相关产品推荐

