Flutter Dart - 带有嵌套映射到数据 class 且已冻结的 Firestore 文档
Flutter Dart - Firestore doc with nested maps to data class with freezed
在 Firestore 中,我的文档结构如下:
在此示例中,映射 lineup
有两个类型为 map
的子项。可能有更多,其他文档可能为零。
我正在尝试将 DocumentSnapshot 的 lineup
映射转换为 freezed 生成的 LineUp 对象。
到目前为止,这是我的代码:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:json_annotation/json_annotation.dart';
part 'line_up.freezed.dart';
part 'line_up.g.dart';
@freezed
abstract class LineUp with _$LineUp {
const factory LineUp({
required Map<String, dynamic> artistMap,
}) = _LineUp;
factory LineUp.fromDocumentSnapshot(DocumentSnapshot documentSnapshot) {
final Map<String, dynamic> parsed = documentSnapshot.data()?["lineup"];
print(parsed.toString()); //prints { p88U4b5lbAwouMVjjNZX: {trackId: 53, name: Name2}, fbei2rdwqBuMDTuFwY4m: {trackId: 23, name: Name1}}
return LineUp.fromJson(parsed); //Exception thrown: 'Null' is not a subtype of type 'Map<String, dynamic>' in type cast
}
factory LineUp.fromJson(Map<String, dynamic> json) => _$LineUpFromJson(json);
}
显然缺少某些东西,因为在冻结的 class.
中没有定义 name
和 trackId
我不确定是否冻结,但您可以手动执行此操作,以便了解冻结或任何第三方插件正在执行的操作。
创建一个class调用的阵容
Class LineUp {
String name;
String trackId;
factory LineUp.fromMap(Map<String, dynamic> map) {
return LineUp(
name: map['name'],
trackId: map['trackId'])}
}
然后,在您要从文档快照创建对象的代码中的某处,
List<LineUp> lineupList=[];
for (var item in documentSnapshot.data()?["lineup"].values){
lineupList.add(LineUp.fromMap(item));
}
print(lineupList[0].name); // should print the name of your first lineup item.
在 Firestore 中,我的文档结构如下:
在此示例中,映射 lineup
有两个类型为 map
的子项。可能有更多,其他文档可能为零。
我正在尝试将 DocumentSnapshot 的 lineup
映射转换为 freezed 生成的 LineUp 对象。
到目前为止,这是我的代码:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:json_annotation/json_annotation.dart';
part 'line_up.freezed.dart';
part 'line_up.g.dart';
@freezed
abstract class LineUp with _$LineUp {
const factory LineUp({
required Map<String, dynamic> artistMap,
}) = _LineUp;
factory LineUp.fromDocumentSnapshot(DocumentSnapshot documentSnapshot) {
final Map<String, dynamic> parsed = documentSnapshot.data()?["lineup"];
print(parsed.toString()); //prints { p88U4b5lbAwouMVjjNZX: {trackId: 53, name: Name2}, fbei2rdwqBuMDTuFwY4m: {trackId: 23, name: Name1}}
return LineUp.fromJson(parsed); //Exception thrown: 'Null' is not a subtype of type 'Map<String, dynamic>' in type cast
}
factory LineUp.fromJson(Map<String, dynamic> json) => _$LineUpFromJson(json);
}
显然缺少某些东西,因为在冻结的 class.
中没有定义name
和 trackId
我不确定是否冻结,但您可以手动执行此操作,以便了解冻结或任何第三方插件正在执行的操作。
创建一个class调用的阵容
Class LineUp {
String name;
String trackId;
factory LineUp.fromMap(Map<String, dynamic> map) {
return LineUp(
name: map['name'],
trackId: map['trackId'])}
}
然后,在您要从文档快照创建对象的代码中的某处,
List<LineUp> lineupList=[];
for (var item in documentSnapshot.data()?["lineup"].values){
lineupList.add(LineUp.fromMap(item));
}
print(lineupList[0].name); // should print the name of your first lineup item.