Flutter - 类“DocumentSnapshot”没有实例获取器“docs”

时间:2021-03-25 17:01:51

标签: firebase flutter dart

我的代码中有 2 个流,第一个流是从好友列表中获取用户 ID,第二个流是使用 ID 列表在 firebase 中搜索用户 ID 的文档。

Stream friendIDStream;
Stream friendNameStream;

Widget friendList() {
    return StreamBuilder(
      stream: friendNameStream,
      builder: (context, snapshot) {
        return snapshot.hasData
            ? ListView.builder(
                itemCount: snapshot.data.docs.length,
                itemBuilder: (context, index) {
                  return FriendTile(
                      snapshot.data.docs[index].data()["username"]);
                },
              )
            : Container();
      },
    );
  }

  @override
  void initState() {
    getUserFriend();
    getNameByID();
    super.initState();
  }

  getUserFriend() async {
    Constant.currentId =
        await HelperFunctions.getUserIdSharedPreference(Constant.currentId);
    setState(() {
      firebaseMethods.getFriend(Constant.currentId).then((value) {
        setState(() {
          friendIDStream = value;
        });
      });
    });
  }

  getNameByID() {
    setState(() {
      firebaseMethods.getFriendName(friendIDStream).then((value) {
        setState(() {
          friendNameStream = value;
        });
      });
    });
  }

这是firestore代码。

  Future getFriend(String ownerid) async {
    return await FirebaseFirestore.instance
        .collection("users")
        .doc(ownerid)
        .collection("friends")
        .snapshots();
  }

  Future getFriendName(friendid) async {
    return await FirebaseFirestore.instance
        .collection("users")
        .doc(friendid)
        .snapshots();
  }

我不知道为什么会发生这种情况,因为我可以显示 ID 列表。我曾尝试将 docs 更改为 doc,但也产生了相同的错误。

编辑:

添加了我的数据库结构的照片。 Path to get a user id from friend list.

Username with userid

1 个答案:

答案 0 :(得分:0)

原因是您的函数 getFriendName 返回的是文档快照而不是查询快照。所以用这个替换你的旧代码:-

Widget friendList() {
    return StreamBuilder(
      stream: friendNameStream,
      builder: (context, snapshot) {
        return snapshot.hasData
            ? ListView.builder(
                itemCount: 1,
                itemBuilder: (context, index) {
                  return FriendTile(
                      //snapshot.data.docs[index].data()["username"] old one
                        snapshot.data["username"]); //new one
                },
              )
            : Container();
      },
    );
  }