【问题标题】:Flutter - Class 'DocumentSnapshot' has no instance getter 'docs'Flutter - 类'DocumentSnapshot'没有实例获取器'docs'
【发布时间】:2021-06-22 12:46:46
【问题描述】:

我的代码中有 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,但也会产生相同的错误。

编辑:

添加了我的数据库结构的照片。

【问题讨论】:

  • 请显示friendNameStream代码,你是如何得到它的
  • friendNameStream 的代码在getNameById() 函数中。
  • 在我看来,您正试图在 DocumentSnapshot 上使用 QuerySnapshot 属性。您从 getFriendName 函数返回的是 DocumentSnapshot。因此,只需从该函数中删除 .doc(friendid) 方法,它就会返回所有文档。
  • @Unbreachable 刚刚尝试过但是返回查询快照没有实例方法'调用'错误。
  • @RaymondChong 哦,是的,还要从snapshot.data.docs[index].data()["username"]); 中删除data(),它现在应该开始工作了。

标签: firebase flutter dart


【解决方案1】:

原因是您的函数 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();
      },
    );
  }

【讨论】:

  • 我刚刚尝试过,但仍然有同样的错误。
  • 我已经更新了代码,请尝试一下,您的代码中还有其他问题,所以如果您显示您的数据库结构(例如存储在文档中的字段)会更好。所以我可以帮你。
  • 我又试了一次,但仍然导致同样的错误,但如果我将 itemCount 更改为 1,则错误更改为 'DocumentSnapshot' 没有实例 getter 'call'。
猜你喜欢
  • 1970-01-01
  • 2020-09-03
  • 2020-10-21
  • 2020-10-19
  • 2021-04-27
  • 2021-05-01
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多