You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter StreamBuilder卡在ConnectionState.waiting问题求助

问题原因及解决方案

核心问题1:getMeasurementDataStreamById 流类型不匹配且数据处理错误

你声明该方法返回 Stream<List<MeasurementData>>,但实际代码通过 expand 将查询快照的文档变更展开成了单个 MeasurementData 流,最终返回的是 Stream<MeasurementData>,类型不匹配导致流无法正确发射列表数据,进而让 Rx.zip2 一直等待第二个流发射符合要求的数据。

核心问题2:使用 Rx.zip2 不符合业务需求

Rx.zip2 要求两个流按顺序配对发射数据,仅当两个流都发射了第N个事件时才会合并输出。而你的场景需要每当Measurement文档或对应的MeasurementData列表更新时,都合并最新的两组数据,zip2 无法满足这个需求,应该使用 Rx.combineLatest2。


修复步骤

1. 修正 getMeasurementDataStreamById 方法

直接将查询快照映射为 MeasurementData 列表,返回正确类型的流:

Stream<List<MeasurementData>> getMeasurementDataStreamById(String id) {
  return db.collection("measurementData")
      .where("measurement", isEqualTo: id)
      .snapshots()
      .map((querySnapshot) => querySnapshot.docs
          .map((doc) => MeasurementData.fromJson(doc.data()!))
          .toList());
}

2. 替换 Rx.zip2 为 Rx.combineLatest2

修改 getById 方法,确保任意一个流更新时都能合并最新数据:

Stream<Measurement> getById(String id) {
  final streamMeasurementStream = db.collection("measurements").doc(id)
      .snapshots()
      .map((document) => StreamMeasurement.fromJson(document.data()!));
  
  final measurementDataStream = getMeasurementDataStreamById(id);
  
  return Rx.combineLatest2(
    streamMeasurementStream,
    measurementDataStream,
    (StreamMeasurement streamMeasurement, List<MeasurementData> measurementData) {
      final measurement = Measurement.fromStreamMeasurement(streamMeasurement, measurementData);
      if (measurement == null) {
        throw Exception('Failed to create Measurement from StreamMeasurement');
      }
      return measurement;
    },
  );
}

3. 额外检查项

  • 确认Firestore安全规则允许读取 measurements 和 measurementData 集合,无权限会导致流一直处于等待状态。
  • 验证文档ID GmfzveKeozkcfdlrk75s 存在于 measurements 集合,且 measurementData 集合中有对应 measurement 字段匹配的文档。
  • 完善 StreamBuilder 的数据判空逻辑:
if (snapshot.hasError) {
  return Text('出错了:${snapshot.error}');
}

if (snapshot.connectionState == ConnectionState.waiting) {
  return const Text("加载中...");
}

if (!snapshot.hasData) {
  return const Text("暂无数据");
}

final measurement = snapshot.data!;
// 构建你的UI

内容的提问来源于stack exchange,提问作者Sonac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 05:39:54