dart - 工厂等待 Future 来构造对象

标签 dart firebase

我怎样才能让工厂内部的这个 Future 同步?我在这里将 null 返回给客户端。

  factory Project.retrieve(String hash, CompetencesService service) {
    Project project;
    service.dbRef.child("project").once("value").then((snapshot) {
      Map val = snapshot.val();
      project = toObservable(new Project.fromJson(val));

      if(project != null) {
        project.listen(service);
        print("listening1");
      } else {
        project = toObservable(new Project.newHash(hash));
        service.dbRef.child("project").update(project.toJson()).then((error) {
          if(error) {
            //
          } else {
            project.listen(service);
            print("listening2");
          }
        });
      }
    });
    return project;
  }

有人asked为此,但我正在寻找解决方法的示例。

最佳答案

目前没有办法创建异步构造函数或工厂,以及同步等待 Future .

后者有一个明显的原因:如果您将停止并同步等待依赖于当前隔离本身的某些东西(不是文件 i/o 之类的外部事件),它将永远不会发生,如 Isolate处于单线程中,该线程在等待状态中停止。

因此,这里唯一的方法是让静态方法返回 FutureProject例如,就像您提供的链接中提到的那样:

static Future<Project> retrieve() async {
  var snapshot = await service.dbRef.child("project").once("value");
  Project project = toObservable(new Project.fromJson(snapshot.val()));

  ...

  return project; // Note you're actually returning a Future here
}

关于dart - 工厂等待 Future 来构造对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31172092/

相关文章:

firebase - 使用没有组织或文件夹的服务帐户创建 GCP 和 Firebase 项目

java - 获取包含具有特定值的子对象的节点

animation - 如何在 Flutter 中制作一个 "Springy curve"的按钮缩放效果?

json - Flutter json_serializable 生成的 json 代码在 Firebase 数据库中保存为字符串

android - 如何使用 FirebaseListAdapter 获取键和值

ios - 为什么 GADBannerView 未声明?

java - Firebase 数据库值未保存

flutter - 使用 getx 包重置 flutter 中 Controller 的所有值?

Flutter GetX 绑定(bind)?

dart - 如何使用 Dart 正确创建安全的 Web 服务器?