Flutter Firebase:如何将Wishlist的wishes存为子集合而非文档字段
解决Firebase中Wishlist的wishes字段序列化问题
1. 移除wishes的自动序列化
在wishes字段上添加@JsonKey(ignore: true)注解,让json_serializable生成的序列化方法直接跳过这个字段,这样Firebase文档里就不会出现wishes字段(包括null值)。修改后的代码如下:
import 'package:json_annotation/json_annotation.dart'; @JsonSerializable() class Wishlist { final String id; String name; // 添加注解忽略该字段的序列化/反序列化 @JsonKey(ignore: true) List<Wish>? wishes; Wishlist({ required this.id, required this.name, this.wishes, }); factory Wishlist.fromJson(Map<String, dynamic> json) => _$WishlistFromJson(json); Map<String, dynamic> toJson() => _$WishlistToJson(this); }
2. 单独处理wishes子集合的保存
保存Wishlist时,先写入主文档,再将wishes单独存入对应的子集合:
final firestore = FirebaseFirestore.instance; Future<void> saveWishlist(Wishlist wishlist) async { // 保存主文档(无wishes字段) await firestore.collection('wishlists').doc(wishlist.id).set(wishlist.toJson()); // 若存在wishes,写入子集合 if (wishlist.wishes != null && wishlist.wishes!.isNotEmpty) { final wishesCollection = firestore.collection('wishlists').doc(wishlist.id).collection('wishes'); // 用批量写入提升性能 final batch = firestore.batch(); for (final wish in wishlist.wishes!) { batch.set(wishesCollection.doc(wish.id), wish.toJson()); } await batch.commit(); } }
3. 读取时加载主文档与子集合
读取Wishlist时,先获取主文档数据,再读取子集合的wishes并赋值:
Future<Wishlist> getWishlist(String wishlistId) async { final firestore = FirebaseFirestore.instance; // 读取主文档 final wishlistDoc = await firestore.collection('wishlists').doc(wishlistId).get(); final wishlist = Wishlist.fromJson(wishlistDoc.data()!); // 读取子集合的wishes final wishesSnapshot = await firestore.collection('wishlists').doc(wishlistId).collection('wishes').get(); wishlist.wishes = wishesSnapshot.docs.map((doc) => Wish.fromJson(doc.data())).toList(); return wishlist; }
补充说明
- 如果
Wish类同样使用json_serializable,可复用@JsonKey(ignore: true)处理不需要存入文档的字段; - 若需要清空子集合的旧数据,可在写入新wishes前先调用
wishesCollection.get()获取旧文档,再用批量删除操作清理。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

