在我的项目中,我一遍又一遍地使用相同的函数,差异很小,从Firebase获取数据,但他们使用不同的模型,并且无法弄清楚如何告诉函数使用正确的模型。
这是我需要调用的函数:
getDataFromFirebase(String firebaseArray, String document) async {
_instance = FirebaseFirestore.instance;
_localModel = [];
CollectionReference collectionReference =
_instance!.collection('collection');
DocumentSnapshot snapshot = await collectionReference.doc(document).get();
var data = snapshot.data() as Map;
var localData;
localData = data[firebaseArray] as List<dynamic>;
localData.forEach((element) {
_localModel.add(model1.fromJson(element));
});
return _localModel;
}
这是第一个模型类:
class Model1 {
String name;
Model1({
required this.name,
});
factory Model1.fromJson(Map<String, dynamic> json) {
return Model1(
name: json['name']
);
}
}
模型 2 类可以具有不同/多个键:
class Model2 {
String name;
int age;
Model2({
required this.name,
required this.age,
});
factory Model2.fromJson(Map<String, dynamic> json) {
return Model2(
name: json['name'],
age: json['age'],
);
}
}
有没有办法解决这个问题,或者我必须为每个方法编写一个函数?
P.S随时询问任何细节。
是的,您可以,在泛型的帮助下:
Future<List<TModel>> getDataFromFirebase<TModel>(
String firebaseArray,
String document,
TModel Function(Map<String, dynamic>) converter) async {
final instance = FirebaseFirestore.instance;
final localModel = <TModel>[];
final collectionReference = instance!.collection('collection');
final snapshot = await collectionReference.doc(document).get();
final data = snapshot.data() as Map;
final localData = data[firebaseArray] as List<dynamic>;
localData.forEach((element) {
localModel.add(converter(element));
});
return localModel;
}
_instance
和_localModel
似乎是实例变量。我将它们设置为局部变量,没有充分的理由在此方法中使用实例变量。
这样称呼它:
final models1 = await getDataFromFirebase<Model1>("?", "?", Model1.fromJson);
final models2 = await getDataFromFirebase<Model2>("?", "?", Model2.fromJson);
显然,用您的参数替换两个"?"
,我不知道您在这里传递了什么。