簡體   English   中英

Flutter 使用 Stream 檢索 firestore 集合

[英]Flutter Retrieving firestore collection using Stream

我正在嘗試使用StreamBuilderfirestore中檢索整個集合,但我無法根據我的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM