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
相关产品推荐
相关产品推荐

