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

标签 flutter dart google-cloud-firestore

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

相关文章:

flutter - 如何完成验证器执行?

flutter - 安装Flutter时如何使用 Dart

ios - 为什么我的 Firebase 存储网址没有上传到 Google Cloud Firestore?

java - 这是从 Android Jetpack ViewModel 在 Firestore 中使用查询的正确方法吗?

android - 添加 Barcode_Scan 包后 Flutter 应用程序无法构建

flutter oAuth : how to get started with OAuth and Stripe connect

flutter - 从推送通知打开 Flutter 应用程序,当它被杀死时

java - Flutter/Dart - FlutterFirebaseMessagingPlugin.java - 构建失败,异常 "error: cannot find symbol"

flutter - 如何更改 ListView 中元素的宽度?

java - Firebase Firestore 读取 Java 中的嵌套对象值 (Android)