从 firestore 获取数据并转换为 json 并在工厂构造函数中使用它

Get data from firestore and convert to json and use that in factory constructor

我正在使用 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'],
    );
  }
}

如果数据存在,从数据库中获取数据的方法

这个方法必须returnsFuture<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'),
    );
  }