You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:15:07