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 流式等待和阻止其他事件