FireStore 读取失败,我不知道为什么

时间:2020-12-23 16:08:35

标签: flutter google-cloud-firestore

非常感谢如何追踪这个问题,因为我的想法不多了。

我正在调用下面的函数 getOrderCollection,但它在第一行 var myCompanyDoc = await FirebaseFirestore.instance.collection('companies').doc(myCompany).get(); 之后中止,没有向控制台发送任何内容或在调试时跳转到某个库。当我点击 next 语句时,它会跳回调用函数。

我通过了数据库的身份验证,companyCollection = FirebaseFirestore.instance.collection('companies') 提供了一个指向集合的初始化对象,而 myCompany 是一个常量,其中包含通过复制/粘贴输入的文档 ID。

如果数据库有一些规则,但我在监视器上看不到成功或拒绝的查询。

有什么想法可以追踪问题吗?

  Future<void> getOrderCollection() async {
    var myCompanyDoc = await FirebaseFirestore.instance.collection('companies').doc(myCompany).get();
    print("companyDoc fetched");
    final myDeliveryDocRef = myCompanyDoc.data()['delivery'].toString();
    orderCollection = FirebaseFirestore.instance.collection('companies').doc(myCompany).collection('features').doc(myDeliveryDocRef).collection('orders');
    orderBriefDoc = FirebaseFirestore.instance.collection('companies').doc(myCompany).collection('features').doc(myDeliveryDocRef);
  }

更新:这是集合 > 文档对应于 final String myCompany = '4U4kZKXkr3rHA6B04S5K';

enter image description here

2 个答案:

答案 0 :(得分:2)

通常,您希望进行一些错误处理并输入已知类型/类(避免使用 var)。

  • 错误处理 - 对于 async/await 将代码放在 try/catch 中。
  • 键入 - Dart 是类型安全的,这对于防止运行时错误非常有用。

根据您的设置,您可以将鼠标悬停在 Firestore.instance.collection(...).doc(...) 上以查看返回类型。 .doc(...).get() 返回 DocumentSnapshot.collection(...).get() 返回 CollectionSnapshot

使用上面的,应该更容易调试:

 Future<void> getOrderCollection() async {
   try {
     DocumentSnapshot myCompanyDoc = await FirebaseFirestore.instance.collection('companies').doc(myCompany).get();
     print("companyDoc fetched");
     final myDeliveryDocRef = myCompanyDoc.data()['delivery'].toString();

   } catch(e) {
     print('Error: ' + e.toString());
   }
 }

不要忘记await您的其他 2 个 Firestore 查询。

答案 1 :(得分:2)

正如我们在您的评论中所讨论的,问题是您忘记await getOrderCollection() 函数。尽管正如您所提到的,您的调用方函数 _deliveryRepository.initRepository() 已被等待,但您仍然必须在调用方方法中 await getOrderCollection() 以确保代码在等待 getOrderCollection() 之前执行它继续到下一行。