Flutter Bloc:将 Firestore 数据提取到模型中

Posted

技术标签:

【中文标题】Flutter Bloc:将 Firestore 数据提取到模型中【英文标题】:Flutter Bloc : Fetch Firestore Data Into Model 【发布时间】:2021-01-16 18:14:51 【问题描述】:

我正在尝试将 Firestore 中的数据提取到我的模型中,但失败了。

错误信息说:

The method '[]' was called on null, tried calling : []("alamat")

这是我的代码:

存储库:

Future<FaskesModel> getFaskesFirestore(String id) async 
    var result = _firestore
        .collection("fakses")
        .doc(id)
        .get()
        .then((snapshot) => FaskesModel.fromSnapshot(snapshot));
    return result;
  

FaskesModel 类:

import 'package:cloud_firestore/cloud_firestore.dart';

class FaskesModel 
  String alamat;
  String id;
  String nama;
  GeoPoint alamatGeo;
  String deskripsi;
  String noTelepon;
  String noTeleponDarurat;
  String urlGambar;
  String website;

  FaskesModel(
      this.alamat,
      this.alamatGeo,
      this.deskripsi,
      this.id,
      this.nama,
      this.noTelepon,
      this.noTeleponDarurat,
      this.urlGambar,
      this.website);

  factory FaskesModel.fromJson(Map<String, dynamic> json) => FaskesModel(
      alamat: json['alamat'] as String,
      alamatGeo: json['alamatGeo'] as GeoPoint,
      deskripsi: json['deskripsi'] as String,
      id: json['id'] as String,
      nama: json['nama'] as String,
      noTelepon: json['noTelepon'] as String,
      noTeleponDarurat: json['noTeleponDarurat'] as String,
      urlGambar: json['urlGambar'] as String,
      website: json['website'] as String);

  Map<String, dynamic> toJson() => 
        "alamat": alamat,
        "alamatGeo": alamatGeo,
        "deskripsi": deskripsi,
        "id": id,
        "nama": nama,
        "noTelepon": noTelepon,
        "noTeleponDarurat": noTeleponDarurat,
        "urlGambar": urlGambar,
        "website": website
      ;

  FaskesModel.fromSnapshot(DocumentSnapshot documentSnapshot)
  
      : alamat = documentSnapshot.data()['alamat'],
        alamatGeo = documentSnapshot.data()['alamatGeo'],
        deskripsi = documentSnapshot.data()['deskripsi'],
        id = documentSnapshot.data()['id'],
        nama = documentSnapshot.data()['nama'],
        noTelepon = documentSnapshot.data()['noTelepon'],
        noTeleponDarurat = documentSnapshot.data()['noTeleponDarurat'],
        urlGambar = documentSnapshot.data()['urlGambar'],
        website = documentSnapshot.data()['urlGambar'];

在班级 Bloc 中,我只是这样称呼:

 FaskesModel faskesModel =
           await  _firebaseRepository.getFaskesFirestore(event.id);

我搜索了另一个问题,我发现要获取 DataSnapshot 字段,只需调用 snapShot.data.data,但就我而言,我只是找到了 snapShot.data()

再一次,我的问题的重点是如何将数据从 Firestore 提取到 FaskesModel

谢谢你。

【问题讨论】:

在存储库中打印结果时显示什么? @AnasMohammed:我打印 documentSnapshot.data() 显示为空。先生,也许我的存储库是错误的。我不知道 尝试在repository中的结果后添加await并检查集合名称是否正确? @AnasMohammed:是的,先生,我刚刚意识到我在写集合名称时打错了。谢谢先生。 【参考方案1】:

将其发布为社区 Wiki,基于 cmets。

在使用快照将数据返回给类时,该问题似乎与集合名称中的错误输入有关。一旦类型正确,数据的返回就会正常工作,并且不会再打印null

【讨论】:

以上是关于Flutter Bloc:将 Firestore 数据提取到模型中的主要内容,如果未能解决你的问题,请参考以下文章

从 StreamBuilder BloC firestore Flutter 获取数据时出错

flutter_bloc - 每个 Bloc 有多个存储库,还是只有一个?

使用 copywith 时 Flutter Bloc 状态未更新

在加载 Firebase 快照时使用 Flutter 中的 Bloc 流式等待和阻止其他事件

Flutter:Firebase 身份验证和 Firestore 快照流

Firestore 和 Flutter:使用流优化数据读取