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

Flutter含子模型类列表的模型类如何实现Firebase工厂构造器?

解决方案

1. 先定义基础模型类

先把Movie和MovieCategory的基础结构写好,包含核心属性和基础的序列化方法:

class Movie {
  final String id;
  final String title;
  final String posterUrl;

  Movie({required this.id, required this.title, required this.posterUrl});

  // Movie的JSON转模型
  factory Movie.fromJson(Map<String, dynamic> json) {
    return Movie(
      id: json['id'] ?? '',
      title: json['title'] ?? '',
      posterUrl: json['posterUrl'] ?? '',
    );
  }

  // Movie转JSON
  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'title': title,
      'posterUrl': posterUrl,
    };
  }
}

class MovieCategory {
  final String categoryId;
  final String categoryName;
  final List<Movie> movies;

  MovieCategory({
    required this.categoryId,
    required this.categoryName,
    required this.movies,
  });

  // 下面实现工厂构造器和toJson方法
}

2. 实现MovieCategory的工厂构造器(处理DocumentSnapshot)

直接处理快照为空、数据为空的情况,同时完成Movie列表的转换:

factory MovieCategory.fromDocumentSnapshot(DocumentSnapshot snapshot) {
  // 快照不存在或无数据时,返回空对象
  if (!snapshot.exists || snapshot.data() == null) {
    return MovieCategory(
      categoryId: '',
      categoryName: '',
      movies: [],
    );
  }

  final data = snapshot.data() as Map<String, dynamic>;

  // 处理movies列表:遍历数组逐个转成Movie对象
  List<Movie> movieList = [];
  if (data['movies'] != null && data['movies'] is List) {
    movieList = (data['movies'] as List)
        .map((movieJson) => Movie.fromJson(movieJson as Map<String, dynamic>))
        .toList();
  }

  return MovieCategory(
    categoryId: data['categoryId'] ?? '',
    categoryName: data['categoryName'] ?? '',
    movies: movieList,
  );
}
  • 所有属性都加了默认值兜底,避免空指针异常
  • 严格判断movies字段的类型,确保转换安全

3. 确认toJson方法的正确性

你的toJson方法只要能把movies列表转成JSON数组就没问题,正确实现如下:

Map<String, dynamic> toJson() {
  return {
    'categoryId': categoryId,
    'categoryName': categoryName,
    'movies': movies.map((movie) => movie.toJson()).toList(),
  };
}

这个写法是正确的:通过map遍历每个Movie对象调用toJson,再转成List,Firebase能正确识别为数组类型。

使用示例

// 从Firebase获取文档并转模型
final docSnapshot = await FirebaseFirestore.instance.collection('movieCategories').doc('action').get();
final movieCategory = MovieCategory.fromDocumentSnapshot(docSnapshot);

// 将模型转JSON存回Firebase
await FirebaseFirestore.instance.collection('movieCategories').doc('action').set(movieCategory.toJson());

内容的提问来源于stack exchange,提问作者user22362195

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:42:18