gpt4 book ai didi

flutter - Dart通用函数,用于映射到对象的转换

转载 作者:行者123 更新时间:2023-12-03 04:18:11 28 4
gpt4 key购买 nike

有没有办法创建将输出正确对象类型的通用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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com