将模型作为参数传递



在我的项目中,我一遍又一遍地使用相同的函数,差异很小,从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);

显然,用您的参数替换两个"?",我不知道您在这里传递了什么。