【问题标题】:Use loop to skip an item of a list in a StreamBuilder使用循环跳过 StreamBuilder 中的列表项
【发布时间】:2021-07-30 19:05:08
【问题描述】:

我正在使用 Stream 检索用户列表,我需要忽略当前用户。我用 Future List 做过一次,但是用 StreamBuilder 定义文档列表时会出现错误。

以下是可行的方法(未来):

Future<List<Users>> _getUsers() async {
    Firestore db = Firestore.instance;

    QuerySnapshot querySnapshot = await db
        .collection('users')
        .getDocuments();

    List<Users> usersList = [];
    for (DocumentSnapshot item in querySnapshot.documents) {
      var data = item.data;
      if (data["id"] == _userId) continue;

      Users user = Users();
      user.name = data["name"];
      user.username = data["username"];
      user.id = data["id"];

      usersList.add(user);
    }

    return usersList;
  }

这不起作用(流):

startConnecting() {
    return Expanded(
      child: StreamBuilder(
        stream:Firestore.instance.collection('users').snapshots(),
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return Center(
              child: Text(
                "Nothing."
                ),
              ),
            );
          }
          return ListView.builder(
            padding: EdgeInsets.only(top: 10),
            scrollDirection: Axis.vertical,
            itemCount: snapshot.data.documents.length,
            itemBuilder: (context, index) =>
                _buildListUsers(context, snapshot.data.documents[index]),
          );
        },
      ),
    );
  }

Widget _buildListUsers(BuildContext context, DocumentSnapshot document) {
    List<Users> usersList = [];
    for (DocumentSnapshot item in document) {

在最后一个 'document' 中出现一条错误消息:“'for' 循环中使用的类型 'DocumentSnapshot' 必须实现 Iterable。”

      var data = item.data;
      if (data["id"] == _userId) continue;

      Users user = Users();
      user.name = document["name"];
      user.username = document["username"];
      user.id = document["id"];

      usersList.add(user);

      return ListTile(
        ...
      );
    }
  }

我查找了这个错误,但没有找到类似的东西。这一定是我缺少的一些简单的东西。

【问题讨论】:

  • 不要这样做:stream:Firestore.instance.collection('users').snapshots()。仔细阅读有关 StreamBuilder 的文档的第二和第三段。他们解释了为什么你正在做的事情被破坏了。

标签: flutter for-loop


【解决方案1】:

您不必遍历 DocumentSnapshot,因为如上所述,它不是可迭代对象,而是单个文档。所以改变这个:

Widget _buildListUsers(BuildContext context, DocumentSnapshot document) {
    List<Users> usersList = [];
    for (DocumentSnapshot item in document) {

到这里:

Widget _buildListUsers(BuildContext context, DocumentSnapshot document) {
    List<Users> usersList = [];
    //for (DocumentSnapshot item in document) { ==> comment out this for loop
  var data = document.data;
    //keep your logic here as it

    //remove the closing curly brace at the end, because there is no more for loop.

要在评论中回答您的第二个问题,请执行以下操作:

if (data["id"] != _userId) {

      Users user = Users();
      user.name = data["name"];
      user.username = data["username"];
      user.id = data["id"];

      usersList.add(user);
    }

【讨论】:

  • 我这样做了,但“项目”变得未定义,并且无法在循环或开关之外使用 continue 语句
  • 也将其更改为:var data = document.data;。你不再需要 item,因为没有 for 循环。
  • 知道了。 continue 语句有什么替代方法吗?
  • 问题解决了吗?我也看不到您的流生成器​​中的继续。您始终可以使用return 来停止进程,而不是使用uid ==uid continue => uid!=uid return
  • 没有。我的意思是这部分if (data["id"] == _userId) continue;。我希望在构建列表时跳过当前用户,而不是停止该过程。有没有办法在不使用 continue 的情况下做到这一点?
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2016-09-23
  • 2022-06-30
  • 2011-09-05
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多