[英]Flutter Retrieving firestore collection using Stream
我正在嘗試使用StreamBuilder
在firestore
中檢索整個集合,但我無法根據我的 dart model 映射結果
這是 dart model thread.dart:
class Thread {
final String threadTitle;
final String threadContent;
final String threadFlair;
final String threadTimestamp;
final List<String> threadLikedBy;
final List<String> originalPoster;
Thread({
this.threadTitle,
this.threadContent,
this.threadTimestamp,
this.threadFlair,
this.threadLikedBy,
this.originalPoster,
});
factory Thread.fromMap(Map<String, dynamic> map) => Thread(
threadTitle: map["threadTitle"],
threadContent: map["threadContent"],
threadFlair: map["threadFlair"],
threadTimestamp: map["threadTimestamp"],
threadLikedBy: List<String>.from(map["threadLikedBy"].map((x) => x)),
originalPoster: List<String>.from(map["originalPoster"].map((x) => x)),
);
Map<String, dynamic> toMap() => {
"threadTitle": threadTitle,
"threadContent": threadContent,
"threadFlair": threadFlair,
"threadTimestamp": threadTimestamp,
"threadLikedBy": List<dynamic>.from(threadLikedBy.map((x) => x)),
"originalPoster": List<dynamic>.from(originalPoster.map((x) => x)),
};
}
這是我在列表視圖中顯示結果的小部件:
class _ThreadsBodyState extends State<ThreadsBody> {
final threads = _mThreadService.retriveData(path: "posts", builder: (data) => Thread.fromMap(data));
@override
Widget build(BuildContext context) {
return Container(
child: StreamBuilder<Object>(
stream: threads,
builder: (context, snapshot) {
if (snapshot.hasData) {
return ListView.builder(
itemBuilder: (BuildContext context, int index) {
Thread thrd = (snapshot.data as List)[index];
return ThreadCard(thread: thrd,);
},
);
} else {return Text('no data');}
}),
);
}
}
這是 posts_service.dart 我有 Stream function
//After restructuring my model and adding:
//List<String> threadLikedBy; and List<String> originalPoster;
//this method works no more
Stream<List<T>> retrieveData<T>({
@required String path,
@required T builder(Map<String, dynamic> data),
}) {
final reference = firestoreInstance.collection(path);
final snapshots = reference.snapshots();
return snapshots.map((snapshot) => snapshot.docs.map((snapshot) => builder(snapshot.data())).toList());
}
看來我在返回中弄亂了映射,但我無法確切地弄清楚如何修復它。
在您的“posts_services.dart”中添加以下 function:
Future<QuerySnapshot> fetchThreads() async {
return await firestoreInstance.collection('posts').get();
}
現在在您構建ListView
的小部件中應該如下所示:
class _ThreadsBodyState extends State<ThreadsBody> {
@override
Widget build(BuildContext context) {
return Container(
child: FutureBuilder<QuerySnapshot>(
future: youService.fetchThreads(),
builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasData) {
return ListView.builder(
itemCount: snapshot.data.size, //to retrieve the size
itemBuilder: (BuildContext context, int index) {
Thread thrd = Thread.fromMap(snapshot.data.docs[index].data());
return ThreadCard(thread: thrd,);
},
);
} else {return Text('no data');}
}),
);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.