【问题标题】:snapshot.data returns null in streambuilder but shows correct value just before I return data model with snapshot datasnapshot.data 在 streambuilder 中返回 null 但在我返回带有快照数据的数据模型之前显示正确的值
【发布时间】:2020-05-08 06:23:22
【问题描述】:

这是我的流生成器​​的代码。

    StreamBuilder<RatesData>(
          stream: DatabaseRatesService(fid: fid).ratesData,
          builder: (context, snapshot) {
            if (!snapshot.hasData) // Doesn't get off from this condition and keeps loading.
              return LoadingLogin(); // A simple loading widget
            RatesData ratesData = snapshot.data;
              print(ratesData.fid);
              return Column(
                mainAxisAlignment: MainAxisAlignment.start,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                  Container(
                    height: 50,
                    child: Text(
                      ratesData.fid,
                      style: TextStyle(color: Colors.black),
                    ),
                  ),
                ],
              );
            }
)

这是我拥有所有数据库查询的类。我似乎已成功从 firebase 获取数据,但它没有显示在我的流生成器​​中。我怀疑数据没有注入到我创建的数据模型中,但不知道如何注入。

class DatabaseRatesService{

  final String fid;
  DatabaseRatesService({this.fid});

DocumentReference get(){
  return Firestore.instance.collection('rates').document(fid);}

  RatesData _ratesDataFromSnapshot(DocumentSnapshot snapshot){
    print(snapshot.data); // I put this here for testing purposes / it returns correct data here
    return RatesData(
      firstHourWeekday: snapshot.data['FirstHourWeekday'],
      firstHourWeekend: snapshot.data['FirstHourWeekend'],
      fid: fid,
      ratesWeekday: snapshot.data['RatesWeekday'],
      ratesWeekend: snapshot.data['RatesWeekend'],
      );
  }
  Stream<RatesData> get ratesData {
    DocumentReference ratesDocument = get();
    return ratesDocument.snapshots()
    .map(
      _ratesDataFromSnapshot
      );
  }

}

更新:它没有返回 null。我尝试收到错误消息。消息说“'type 'List' 不是 type 'List' 的子类型”。

【问题讨论】:

  • 你知道确切的错误是什么吗?您可以使用 if (snapshot.hasError) print(snapshot.error.toString); 快速检查它;
  • 从来没想过。我只是假设它返回null。错误说“类型 'List' 不是类型 'List' 的子类型” 我的数据模型中有字符串和字符串数组。 Streambuilders不能处理数组吗?
  • 您需要在此处将动态转换为所需类型。在您的 _ratesDataFromSnapshot 内将动态列表转换为字符串列表尝试使用 snapshot.data['field-name'].cast().toList()
  • 修复了它,并且可以按照我的意愿工作。谢谢。您能否发布答案以便我接受?

标签: firebase flutter stream-builder


【解决方案1】:

根据您的comment,您将需要编辑您的方法 _ratesDataFromSnapshot 以处理非原始数据类型和空值(如果返回的数据没有您要尝试的字段阅读)

snapshot.data['field'].cast<String>().toList() ?? List() // handle the null case as well with empty list    

【讨论】:

    【解决方案2】:

    存在格式问题,您缺少 if 语句周围的 {} 大括号 试试下面

    if (!snapshot.hasData) // 不会脱离这​​种情况并继续加载。 {return LoadingLogin();}

    【讨论】:

      猜你喜欢
      • 2020-11-15
      • 2019-11-22
      • 2021-08-23
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-02
      相关资源
      最近更新 更多