[英]How to parse nested objects from Firestore?
I want to parse this object to Dart object but I face issues when it becomes nested.我想将这个 object 解析为 Dart object 但是当它嵌套时我会遇到问题。 It works when there are not any nested custom objects but when I try to parse the nested object I get an error.它在没有任何嵌套的自定义对象时有效,但当我尝试解析嵌套的 object 时出现错误。
This is the model on Firestore这是 Firestore 上的 model
These are the code of my models这些是我的模型的代码
class Testt {
final String name;
final List<Prefs> prefs;
const Testt({this.name, this.prefs});
Map<String, dynamic> toMap() {
return {
'name': name,
'prefs': prefs
};
}
factory Testt.fromJSON(Map<String, dynamic> json) {
return Testt(
name: json['name'],
prefs: (json['prefs'] as List).map((e) => Prefs.fromJSON(e)).toList()
);
}
}
class Prefs {
final String first;
final String second;
const Prefs({this.first, this.second});
Map<String, dynamic> toMap() {
return {
'first': first,
'second': second
};
}
factory Prefs.fromJSON(Map<String, dynamic> json) {
print(json);
return Prefs(
first: json['first'],
second: json['second']
);
}
}
And this is the method that I use to fetch data from Firestore这是我用来从 Firestore 获取数据的方法
Stream<List<Testt>> getTestt() {
return _db.collection('test').snapshots().map((snapshot) => snapshot.documents.map((document) => Testt.fromJSON(document.data)).toList());
}
I really need your help, couldn't find any working solutions.我真的需要你的帮助,找不到任何可行的解决方案。 Thanks in advance提前致谢
Try this, it might work for you试试这个,它可能对你有用
import 'dart:convert';
class Testt {
final String name;
final List<Prefs> prefs;
Testt({
this.name,
this.prefs,
});
Testt copyWith({
String name,
List<Prefs> prefs,
}) {
return Testt(
name: name ?? this.name,
prefs: prefs ?? this.prefs,
);
}
Map<String, dynamic> toMap() {
return {
'name': name,
'prefs': prefs?.map((x) => x?.toMap())?.toList(),
};
}
factory Testt.fromMap(Map<String, dynamic> map) {
if (map == null) return null;
return Testt(
name: map['name'],
prefs: List<Prefs>.from(map['prefs']?.map((x) => Prefs.fromMap(x))),
);
}
String toJson() => json.encode(toMap());
factory Testt.fromJson(String source) => Testt.fromMap(json.decode(source));
@override
String toString() => 'Testt(name: $name, prefs: $prefs)';
}
class Prefs {
final String first;
final String second;
Prefs({
this.first,
this.second,
});
Prefs copyWith({
String first,
String second,
}) {
return Prefs(
first: first ?? this.first,
second: second ?? this.second,
);
}
Map<String, dynamic> toMap() {
return {
'first': first,
'second': second,
};
}
factory Prefs.fromMap(Map<String, dynamic> map) {
if (map == null) return null;
return Prefs(
first: map['first'],
second: map['second'],
);
}
String toJson() => json.encode(toMap());
factory Prefs.fromJson(String source) => Prefs.fromMap(json.decode(source));
@override
String toString() => 'Prefs(first: $first, second: $second)';
}
class TestMapping extends StatelessWidget {
@override
Widget build(BuildContext context) {
Stream<List<Testt>> getTestt() {
return FirebaseFirestore.instance.collection("Test").snapshots().map(
(snapshot) => snapshot.docs
.map((document) => Testt.fromMap(document.data()))
.toList());
}
return Scaffold(
body: StreamBuilder(
stream: getTestt(),
builder: (BuildContext context, AsyncSnapshot<List<Testt>> snaphot) {
print(snaphot.data);
if (snaphot.hasData) {
return Center(
child: Column(
children: snaphot.data.map((e) {
return Column(
children: [
Text("Name: " + e.name),
for (var _prefs in e.prefs)
Column(
children: [
Text("First: " + _prefs.first),
Text("Second: " + _prefs.second)
],
),
],
);
}).toList()),
);
} else {
return Center(
child: CircularProgressIndicator(),
);
}
},
),
);
}
}
Got this data得到这个数据
[Testt(name: burak, prefs: [Prefs(first: asd, second: dsa), Prefs(first: abc, second: cba)])]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.