目前,我有一个列表视图,它由一个从FireBase FireStore(例如用户列表)获取数据的streambuilder扭曲。这就是它的样子:

Widget UsersList = new StreamBuilder(
  stream: Firestore.instance
    .collection('users')
    .snapshots(),
  builder: (context, snapshot) {
    if (!snapshot.hasData) return const Text("loading");
    return new ListView.builder(
      itemCount: snapshot.data.documents.length,
      itemBuilder: (context, index) =>
        _buildItem(context, snapshot.data.documents[index]),
    );
  }
);

问题是如何在ListView顶部添加一个静态小部件(例如创建新用户的按钮),我不希望该按钮一直停留在页面顶部,它应该随着ListView滚动。
解决方法:在_buildItem()函数中,如果它是第一个文档(通过传递到函数index==0),并且如果为true,则可以首先构建静态小部件(例如,添加用户按钮)。但我可以想到三个问题:
如果FireStore集合中没有任何文档,则不会呈现静态小部件。
如果Internet连接速度慢,在下载第一个文档之前,它不会呈现静态小部件。
这是一个解决办法…

最佳答案

您可以检查ListView.builder中的长度,并始终为按钮添加一个项目。

Widget UsersList = new StreamBuilder(
  stream: Firestore.instance.collection('users').snapshots(),
  builder: (context, snapshot) {
    return new ListView.builder(
      itemCount: (snapshot?.data?.documents?.length ?? 0) + 1,
      itemBuilder: (context, index) {
        if (index == 0)
          return FlatButton(child: Text("Add"));
        else
          _buildItem(context, snapshot.data.documents[index-1]);
      },
    );
  },
),

10-08 12:17