有没有办法创建将输出正确对象类型的通用parseFromMap()
函数?
我有多个从Firebase DocumentSnapshot
反序列化的数据类。我正在尝试创建一个数据类将继承或实现的抽象类。所有类都应实现parseFromMap()
函数,该函数会将Json转换为对象。这是我尝试抽象类的尝试:
abstract class FirebaseConverter<T> {
FirebaseConverter(Map<String, dynamic> snapshot, String id);
Map toJson();
T parseFromMap(Map<String, dynamic> snapshot, String id);
}
接下来,我要创建一个通用函数,该函数将DocumentSnapshot解析为最终对象类型。 Future<T> getDocumentById(String id) async {
DocumentSnapshot snap = firebaseRef.doc(id).get();
return T.parseFromMap(snap.data(), snap.id);
}
显然,这是失败的,因为parseFromMap(snap, snap.id)
不是静态的。抽象类不能具有静态函数。到目前为止,我所做的是在每个特定的类中都有一个特定的
Future<SomeSpecificFirebaseObject> getDocumentById()
,但这是很多复制的基本要求。
最佳答案
当前的getDocumentById(...)
实现将失败,因为您不能将通用类型用作实例类型。泛型不是对象。
这是我指的一种好方法:https://stackoverflow.com/a/28556110/6735934
让我们从那里使用ItemCreator
自定义函数。
tl; dr:您基本上创建了一个对象的空实例,您希望在该实例上填充数据,然后将其返回到ItemCreator
函数。
让我们开始
考虑问题中具有类似方法的FirebaseSerializer
类
typedef S ItemCreator<S>();
class FirebaseSerializer {
static T serializeThis<T extends FirebaseConverter>(ItemCreator<T> itemCreator, String id) {
// (1) Casting your specific object to its base class
FirebaseConverter item = itemCreator();
// Your Firebase Specfics
DocumentSnapshot snap = firebaseRef.doc(id).get();
// Calling your base class' method, now possible
return item.parseFromMap(snap, id);
}
}
此方法接受类型为“T” 的ItemCreator
,该类型扩展了FirebaseConverter
,这将返回T
的实例。为什么要扩展? 用于强制转换到
FirebaseConverter
(请参见上面的片段中的(1))现在,举个例子:
class A implements FirebaseConverter {
@override
parseFromMap(Map<String, dynamic> snapshot, String id) {
// TODO ...
}
@override
Map toJson() {
// TODO ...
}
}
FirebaseSerializer发挥作用!A anInstanceOfA = FirebaseSerializer.serializeThis<A>(() => new A(), "your snap ID");
关于flutter - Dart通用函数,用于映射到对象的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64227122/