Flutter Flow中修改Firestore集合特定字段值的问题
在Flutter Flow中修改Firestore集合特定字段值的问题
问题背景
需要在Flutter Flow中修改从Firestore集合获取的特定字段值,其中SomeModel是文档返回的固定类型,无法创建与CircleRecord集合属性一致的自定义类。
当前尝试的代码步骤
- 从Firebase获取数据并存储到
querySnapshot变量:
QuerySnapshot querySnapshot = await FirebaseFirestore.instance .collection('collection-name') .where("data", arrayContains: userRef) .get();
- 创建用于存储新数据的空列表:
List<SomeModel> x = [];
- 通过
map将每个文档转换为SomeModel并存入列表:
x = querySnapshot.docs.map((DocumentSnapshot doc) { return SomeModel.fromSnapshot(doc); }).toList();
- 使用
forEach修改列表中数据的特定字段值:
x.forEach((data) { data.fieldName = 'Hello'; });
- 返回修改后的完整数据列表:
return x;
遇到的问题
尝试自定义SomeModel类时,出现模型重复定义的错误;修改自定义类名后,又因返回类型要求为Firebase提供的SomeModel类而无法返回。
解决方案
方案1:修改Flutter Flow生成模型的字段可变性
Flutter Flow默认生成的模型字段是final不可变的,可通过以下步骤修改:
- 打开Flutter Flow的Data > Firestore Collections面板,找到对应的集合
- 编辑目标字段的属性,去掉
final修饰,设置为可修改 - 之后直接使用原
forEach代码即可修改字段值
方案2:通过转换类实现字段修改
如果无法修改生成的模型类,可创建自定义转换类,实现原模型和可修改模型的双向转换:
// 自定义可修改的模型类 class MutableSomeModel { String? fieldName; // 复制原SomeModel的所有字段,去掉final修饰符 // 从原模型初始化 MutableSomeModel.fromSomeModel(SomeModel model) { fieldName = model.fieldName; // 复制其他字段 } // 转换回原模型类型 SomeModel toSomeModel() { return SomeModel( fieldName: fieldName, // 传入其他字段 ); } } // 实际使用流程 List<SomeModel> originalList = querySnapshot.docs.map((doc) => SomeModel.fromSnapshot(doc)).toList(); // 转换为可修改类并修改字段 List<MutableSomeModel> mutableList = originalList.map((model) => MutableSomeModel.fromSomeModel(model)).toList(); mutableList.forEach((item) { item.fieldName = 'Hello'; }); // 转换回原类型返回 return mutableList.map((item) => item.toSomeModel()).toList();
方案3:使用copyWith方法创建新实例
Flutter Flow生成的模型通常自带copyWith方法,可直接创建修改后的新实例:
List<SomeModel> originalList = querySnapshot.docs.map((doc) => SomeModel.fromSnapshot(doc)).toList(); // 通过copyWith修改指定字段 List<SomeModel> modifiedList = originalList.map((item) { return item.copyWith(fieldName: 'Hello'); }).toList(); return modifiedList;
内容的提问来源于stack exchange,提问作者sahil patel
相关产品推荐
相关产品推荐

