如何解决从 firestore 获取数据并转换为 json 并在工厂构造函数中使用它 更新
我使用 firestore
作为数据库。如果数据库中不存在数据,那么它将执行 webscrape
。在 webscrape
中,我设法将数据转换为 json
并使用了 factory constructor
。我希望从 firestore
获取数据时应该发生同样的事情。
另外一件事我有一个特定集合和文档 ID 所以我使用了 .collection('medicine').doc('id').get()
。
工厂构造器
class Tablet {
String name;
String introduction;
Tablet({
this.name,this.introduction,});
factory Tablet.fromJson(Map<String,dynamic> json) {
return Tablet(
name: json['name'],introduction: json['introduction'],);
}
}
如果数据存在从数据库中获取数据的方法
这是一个必须返回 Future<Tablet>
的方法(我陷入了 if condition
)
Future<Tablet> details;
Future<Tablet> getDetails(String medName) async {
await Firebase.initializeApp();
await FirebaseFirestore.instance
.collection('medicine')
.doc(medName.toLowerCase())
.get()
.then((DocumentSnapshot docSnapshot) {
if (docSnapshot.exists) {
var json = jsonDecode(docSnapshot.data().toString()); // I am getting stuck here
details = Tablet.fromJson(json) as Future<Tablet>;
} else {
print('Data not present in Database..');
details = webScrape(medName);
}
});
return details;
}
我在 webscrape(medName)
中尝试的是
Tablet.fromJson(jsonDecode(response.body));
此处返回以上行并将其分配给 Future 工作,但在 if
条件下,它要求进行类型转换并抛出以下错误
错误
FormatException: Unexpected character (at character 2)
{benefits: {values: [{header: In Heartburn,display_text: Heartburn and aci...
^
更新
作为@Tarik Huber 的第二个建议,启发并更改了一些代码,如图所示
factory Tablet.fromSnapshot(DocumentSnapshot docSnap){
return Tablet(
name: docSnap.get('name');
introduction: docSnap.get('introduction');
);
}
现在我的问题是,下面的代码不起作用
details = Tablet.fromSnapshot(docSnapshot.data()) as Future<Tablet> // is not working
改为调用异步函数,如图所示
details = arrangeData(docSnapshot.data());
Future<Tablet> arrangeData(DocumentSnapshot data) async{
return Tablet.fromSnapshot(data);
}
我知道这不是一个好方法,它正在工作,但不知道如何?谁能解释一下..
解决方法
您是否尝试过:
details = Tablet.fromJson(docSnapshot.data()) as Tablet;
数据类型为 Map<String,dynamic>
。这与您的转换函数采用的类型相同。
否则你可以只添加一个
factory Tablet.fromSnapshot(DocumentSnapshot docSnapshot) {
return Tablet(
name: docSnapshot.get('name'),introduction: docSnapshot.get('introduction'),);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。