显示未来列表函数 Firebase GetX

Displaying a Future List Function Firebase GetX

我正在尝试创建一个用户源,就像使用 Firebase 和 GetX 的 Twitter 一样。
在代码片段中是我的函数..

List<PostModel> postListFromSnapshot(QuerySnapshot snapshot) {
return snapshot.docs.map((doc) {
  return PostModel(
    id: doc.id,
    text: (doc.data() as dynamic)["text"] ?? "",
    creator: (doc.data() as dynamic)["creator"] ?? "",
    timestamp: (doc.data() as dynamic)["timestamp"] ?? 0,
  );
}).toList();
}

Future<List<PostModel>> getFeed() async {
List<String> usersFollowing = await UserService() //['uid1', 'uid2']
    .getUserFollowing(FirebaseAuth.instance.currentUser!.uid);

QuerySnapshot querySnapshot = await FirebaseFirestore.instance.collection("posts").where('creator', whereIn: usersFollowing)
.orderBy('timestamp', descending: true)
.get();

return postListFromSnapshot(querySnapshot);
}

我想做的是显示 Future 函数 getFeed(),我使用 GetX 进行状态管理。所以,我的问题是如何使用 ListView.Builder()

显示此函数的结果

以下是我使用 Future 构建器的方式

FutureBuilder(
  future: _.listPost,
  initialData: [PostModel(id: "2", creator: "Fm", text: "Testing", timestamp: Timestamp.now())],
  builder: (BuildContext context, AsyncSnapshot snapshot){
    if(snapshot.hasData == null){
      return Text("Data is available");
    } else{
      return ListView.builder(
        shrinkWrap: true,
        itemCount: snapshot.data.toString().length,
        itemBuilder: (context, index){
          PostModel posts = snapshot.data[index];
          return Column(
            children: [
              Text(posts.text)
            ],
          );
        },
      );
    }
  },
)

这是我得到的错误

The following NoSuchMethodError was thrown building:
The method '[]' was called on null.
Receiver: null
Tried calling: [](3)

它还指出了
上的一个错误 PostModel post 行.. 准确地说是 [index]

首先,将您的 AsyncSnapshot snapshot 设为 AsyncSnapshot<List<PostModel>> snapshot。这不是你的主要问题,但它会让事情变得更容易正确打字,而不必猜测使用 dynamic.

你的问题是 hasDatabool。它要么是 true 要么是 false,但绝不是 null。我想知道你是如何通过你的编译器得到那一行的。您使用的是过时版本的 Flutter 吗?你应该检查一下,你的编译器是你的朋友,如果它不能正确地帮助你,这将是一条艰难而崎岖的道路。

反正你先看看有没有数据,如果有none,你还在等:

FutureBuilder(
  future: _.listPost,
  builder: (BuildContext context, AsyncSnapshot<List<PostModel>> snapshot){
    if(!snapshot.hasData){
      return CircularProgressIndicator();
    } else {
      final postList = snapShot.requireData;

      return ListView.builder(
        shrinkWrap: true,
        itemCount: postList .length,
        itemBuilder: (context, index){
          final post = postList[index];
          return Column(
            children: [
              Text(post.text)
            ],
          );
        },
      );
    }
  },
)