为啥我在 Flutter 中使用 Firestore 中的 foreach 方法后得到空值?

Posted

技术标签:

【中文标题】为啥我在 Flutter 中使用 Firestore 中的 foreach 方法后得到空值?【英文标题】:Why do i get null after using the foreach method in Flutter wih Firestore?为什么我在 Flutter 中使用 Firestore 中的 foreach 方法后得到空值? 【发布时间】:2020-09-29 07:17:29 【问题描述】:

我试图同时获取用户文档及其子集合。但我发现在查询中这是不可能的。所以我决定从另一个角度来解决这个问题。


我们有什么?

我有一个getRelative() getter,它返回Stream<Relative>

  Stream<Relative> get getRelative async* 
    List<Patient> patientList;

    patientList = await getPatientCollection
        .forEach((element) => element.patients)
        .then((value) => value);

      yield* usersCollection
          .document(_userEmail)
          .snapshots()
          .map((snapshot) => _relativeDataFromSnapshot(snapshot, patientList));
    
  

getPatientCollection() 是另一个 getter 方法,它返回 Stream&lt;PatinetList&gt;。我不会给出吸气剂的细节。因为它工作正常。


有什么问题?

问题是当我得到Stream&lt;PatientList&gt; 时,我得到的是Stream。所以,只是为了将其转换为Future,我使用了forEach 方法。它也可以正常工作。我可以看到element.patients 不是空的。我可以看到它的内部和它的返回类型 List&lt;Patient&gt; 应该是。

但是当我调试它时,forEach() 完成它的工作后,我意识到它返回 null。并且patientList 变为空。这会导致问题。


我在问什么?

    是什么导致了这个问题?我该如何解决? 有没有更好的方法来获取子集合,而无需使用另一个 Stream 来获取患者子集合 (getPatientCollection)?

【问题讨论】:

【参考方案1】:

Stream.forEachStream 等效于 List.forEach(返回 void)。它是为了对每个元素做一些操作,而不是为了返回一个新的集合。如果您想将Stream&lt;T&gt; 转换为List&lt;T&gt;,您可以使用await stream.toList()

【讨论】:

你刚刚救了我詹姆斯。我不知道我是怎么错过的。非常感谢!

以上是关于为啥我在 Flutter 中使用 Firestore 中的 foreach 方法后得到空值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在flutter中更新http包后不能在http.post方法中放一个字符串

为啥我在 Flutter 测试期间使用 rootBundle.load 得到“对空值使用空检查运算符”?

为啥我在运行后在 Flutter 上收到“无法执行 aapt”错误?

为啥我在flutter_web中更新HtmlView时得到_state!= _PlatformViewState.disposed不是真正的异常?

为啥当我在其小部件中调用 Flutter 有状态小部件时,它没有改变另一个有状态小部件的状态

为啥我在构建 Flutter Web 时会出现白屏