【问题标题】:I can't fetch data from two different collection consecutively in Firebase with Flutter我无法使用 Flutter 在 Firebase 中连续从两个不同的集合中获取数据
【发布时间】:2022-01-06 16:32:31
【问题描述】:

我试图从两个不同的集合中获取,但我遇到了一个奇怪的情况。首先,我想从帖子集合中获取用户 ID。然后使用该用户 ID,我想从用户集合中获取数据。

因此,当我仅从帖子集合中获取时,打印命令可以正常工作并打印用户 ID。

但是当我添加我在下面的代码中显示的用户获取语句时,它不会获取它并显示一个空字符串 (''),并且用户集合发送错误,因为我无法搜索用户 ID。我在这里错过了什么?

class _ProductDetail extends State<ProductDetail> {
  String getTitle = '';
  String getLocation = '';
  String getPrice = '';
  String getImage = '';
  String getUniversity = '';
  String getProfileImage = '';
  String getUserName = '';
  String getSellerUserID = '';

  @override
  Widget build(BuildContext context) {
    FirebaseFirestore.instance
        .collection('posts')
        .doc(widget.postID)
        .get()
        .then((incomingData) {
      setState(() {
        getTitle = incomingData.data()!['title'];
        getPrice = incomingData.data()!['price'];
        getImage = incomingData.data()!['postImage'];
      });
    });
    FirebaseFirestore.instance
        .collection('posts')
        .doc(widget.postID)
        .get()
        .then((incomingData) {
      setState(() {
        getSellerUserID = incomingData.data()!['userID'];
      });
    });
    print(getSellerUserID); //statement that will print the userID

    //////////////////////IF I DELETE THIS SECTION, IT PRINTS THE USER ID//////////////////
    FirebaseFirestore.instance
        .collection('users')
        .doc(getSellerUserID)
        .get()
        .then((incomingData) {
      setState(() {
        getUserName = incomingData.data()!['username'];
        getProfileImage = incomingData.data()!['profileImage'];
        getUniversity = incomingData.data()!['university'];
        getLocation = incomingData.data()!['location'];
      });
    });
    ///////////////////////////////////////////////////////////////////////////////////////////////
    return Scaffold(
    ....... rest of the code

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    由于数据是从 Firestore 异步加载的,then 块中的代码在调用 get() 之后的行之后被调用(方式)。

    要最容易看到这一点,请添加一些这样的日志记录:

    print("Before calling Firestore")
    FirebaseFirestore.instance
        .collection('posts')
        .doc(widget.postID)
        .get()
        .then((incomingData) {
      print("Got data")
    });
    print("Before calling Firestore")
    

    如果你运行这段代码,它会打印:

    调用 Firestore 之前

    调用 Firestore 后

    得到数据

    这可能不是您期望的顺序,但确实解释了为什么您从数据库中的下一个加载不起作用:getSellerUserID = incomingData.data()!['userID'] 行到那时还没有运行。

    因此:任何需要 Firestore 数据的代码都需要位于 then(或 onSnapshot)处理程序中,从那里调用,或者以其他方式同步。


    所以最简单的解决方法是将下一个数据库调用移到`then:

    FirebaseFirestore.instance
        .collection('posts')
        .doc(widget.postID)
        .get()
        .then((incomingData) {
      var sellerUserID = incomingData.data()!['userID'];
      setState(() {
        getSellerUserID = sellerUserID;
      });
      print(sellerUserID);
    
      FirebaseFirestore.instance
        .collection('users')
        .doc(sellerUserID)
        .get()
        .then((incomingData) {
        setState(() {
          getUserName = incomingData.data()!['username'];
          getProfileImage = incomingData.data()!['profileImage'];
          getUniversity = incomingData.data()!['university'];
          getLocation = incomingData.data()!['location'];
        });
      });
    });
    

    【讨论】:

      猜你喜欢
      • 2021-03-05
      • 2020-09-07
      • 2021-03-06
      • 2020-09-08
      • 2022-11-06
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      相关资源
      最近更新 更多