Flutter中基于Property Id同步更新Firestore两个集合数据
解决Firebase两个集合同步更新问题
修改思路
- 提取更新字段为独立变量,避免重复编写冗余代码
- 并行执行两个集合的更新操作,确保数据同步完成
- 添加错误捕获逻辑,处理更新失败场景
情况1:adviserData的文档ID等于'Property Id'值
如果adviserData集合的文档ID直接对应Property Id字段值,可直接使用以下代码:
ElevatedButton.icon( onPressed: () async { // 统一提取更新数据,简化维护 final updateData = { 'Property Title': propertyTitleController.text, 'Property Address': propertyAddressController.text, 'Property Cover': propertyCoverController.text, 'Property Description': propertyDescriptionController.text, 'Google Maps Link': propertyLocationController.text, 'Property Status': propertyStatusController.text, 'Price Sqft': pricePerSqftController.text, 'Posssesion Date': possessionDateController.text, 'Max Sqft': maxAreaController.text, 'Min Sqft': minAreaController.text, 'Rera Id': rearaIdController.text, 'Total Floors': totalFloorsController.text, 'Total Units': totalUnitsController.text, 'One Bhk': oneBhkConfigController.text, 'Two Bhk': twoBhkConfigController.text, 'Three Bhk': threeBhkConfigController.text, 'Four Bhk': fourBhkConfigController.text, 'Five Plus Bhk': fivePlusBhkConfigController.text, 'Launch Date': launchDateController.text, 'Total Project Area': totalProjectAreaController.text, }; final buildercollRef = FirebaseFirestore.instance.collection('builderData'); final adviserdocRef = FirebaseFirestore.instance.collection('adviserData'); try { // 并行执行两个更新,等待全部完成 await Future.wait([ buildercollRef.doc(widget.propertyId).update(updateData), adviserdocRef.doc(widget.propertyId).update(updateData), ]); // 可添加更新成功提示,比如SnackBar // ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('数据同步更新成功'))); } catch (e) { // 处理更新错误 // print('更新失败: $e'); // ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('更新失败: $e'))); } }, icon: Icon(Icons.save), label: Text('同步更新'), )
情况2:adviserData的文档ID不等于'Property Id'值
如果adviserData的文档ID与Property Id字段无关,需先查询匹配文档再批量更新:
ElevatedButton.icon( onPressed: () async { final updateData = { // 同上的更新字段集合 'Property Title': propertyTitleController.text, 'Property Address': propertyAddressController.text, 'Property Cover': propertyCoverController.text, 'Property Description': propertyDescriptionController.text, 'Google Maps Link': propertyLocationController.text, 'Property Status': propertyStatusController.text, 'Price Sqft': pricePerSqftController.text, 'Posssesion Date': possessionDateController.text, 'Max Sqft': maxAreaController.text, 'Min Sqft': minAreaController.text, 'Rera Id': rearaIdController.text, 'Total Floors': totalFloorsController.text, 'Total Units': totalUnitsController.text, 'One Bhk': oneBhkConfigController.text, 'Two Bhk': twoBhkConfigController.text, 'Three Bhk': threeBhkConfigController.text, 'Four Bhk': fourBhkConfigController.text, 'Five Plus Bhk': fivePlusBhkConfigController.text, 'Launch Date': launchDateController.text, 'Total Project Area': totalProjectAreaController.text, }; final buildercollRef = FirebaseFirestore.instance.collection('builderData'); final adviserdocRef = FirebaseFirestore.instance.collection('adviserData'); try { // 先更新builderData目标文档 await buildercollRef.doc(widget.propertyId).update(updateData); // 查询adviserData中Property Id匹配的所有文档 final querySnapshot = await adviserdocRef .where('Property Id', isEqualTo: widget.propertyId) .get(); // 批量更新查询到的文档,提升效率 final batch = FirebaseFirestore.instance.batch(); for (var doc in querySnapshot.docs) { batch.update(doc.reference, updateData); } await batch.commit(); // 更新成功提示 // ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('数据同步更新成功'))); } catch (e) { // 错误处理 // print('更新失败: $e'); // ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('更新失败: $e'))); } }, icon: Icon(Icons.save), label: Text('同步更新'), )
关键说明
- 使用
Future.wait并行执行更新,比顺序执行效率更高,且能保证操作的原子性(要么全部成功,要么全部失败) - 提取
updateData变量,减少代码冗余,后续修改字段只需维护一处 - 添加
try-catch捕获异常,避免更新失败导致应用崩溃,同时可向用户反馈状态 - 多文档更新时用Firestore批量操作(
batch),减少网络请求次数,提升性能
内容的提问来源于stack exchange,提问作者hemanth_101
相关产品推荐
相关产品推荐

