【问题标题】:java.lang.IllegalArgumentException: Invalid document reference. Document references must have an even number of segments, but users has 1java.lang.IllegalArgumentException:无效的文档引用。文档引用必须有偶数个段,但用户有 1
【发布时间】:2020-09-30 07:42:58
【问题描述】:

伙计们,我被这个错误弄疯了。我已经在这里搜索过并有一些答案,但没有一个与我合作。让我更疯狂的是这段代码:

_reloadInfo()async{

    Firestore reload = Firestore.instance;

    DocumentSnapshot orderStatus =
    await reload.collection("users")
        .document(_userId).get();

    Map<String, dynamic> status = orderStatus.data;
    setState(() {
      _orderStatus = status["order_status"];
    });

  }

在另一个班级上正常工作。我刚刚复制了,因为我想在这个相同类型的类(有状态)中得到相同的结果,这个错误就会发生。

E/MethodChannel#plugins.flutter.io/cloud_firestore(24705):java.lang.IllegalArgumentException:无效的文档引用。文档引用必须有偶数个段,但用户有 1 个

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    问题几乎可以肯定是_userId 是一个空字符串。在调用 Firstore API 之前,您应该验证您是否拥有需要访问的文档路径的正确字符串。添加一些调试日志以供您自己查看,或使用调试器单步调试您的代码以查看您正在处理的内容。

    【讨论】:

    • 我打印了 _userId 并且加载正常。我已经将获取 uid 的同一个函数放入了相同的函数中,即使更改为直接调用(在我的情况下是 _loggedUser.uid 和相同),也会发生相同的错误。让我抓狂的是,同样的代码在另一个页面上正常工作。
    • 请编辑问题以显示您如何知道字符串设置正确。在查询之前添加调试日志语句,证明一切正常,直到查询点。就目前而言,您的问题没有足够的细节。我建议还尝试将字符串硬编码到 API 中,看看它是否有效。
    • 这太疯狂了。现在我进入构建状态并工作,但多次调用,这不是我想要的。我绝对不知道为什么 initState 不起作用。关于你所说的,我是一个初学者,不知道具体什么以及如何调试或硬编码。
    【解决方案2】:

    我已经解决了我的问题,但不完全是我认为应该的方式,但我会告诉你。

    我在放这个函数:

    _reloadInfo()async{
    
        Firestore reload = Firestore.instance;
    
        DocumentSnapshot orderStatus =
        await reload.collection("users")
            .document(_userId).get();
    
        Map<String, dynamic> status = orderStatus.data;
        setState(() {
          _orderStatus = status["order_status"];
        });
    
      }
    

    从 initState 开始,与我在其他页面上所做的一样。结果就是那个错误。 然后我尝试开始构建,它成功了,但一直调用很多次,结论是这样的:

    void _getOrderStatus()async{
        if(_orderStatus == false){
          DocumentSnapshot orderStatus =
          await db.collection("users")
              .document(_userId)
              .get();
    
          Map<String, dynamic> status = orderStatus.data;
          setState(() {
            _orderStatus = status["order_status"];
            _tableId = status["table_id"];
          });
        }
      }
    

    放入if里面,得到我想要的结果后哈哈。

    但我仍然想知道为什么它在 initState 上不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 2021-01-12
      • 2019-04-17
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      相关资源
      最近更新 更多