飞镖等待上构造

问题描述 投票:1回答:1

我应该在这个例子中使用什么样的模式来加载和处理一些数据。作为value返回一个值,这是不能接受的有d作为未来。我怎样才能构造等到load已完成再继续?

void main() {
    var data = new Data(); // load data
    print(data.value()); // data.d is still null
}

class Data {
    String d;
    Data() {
        load();
    }

    Future<void> load() async {
        d = await fn(); // some expensive function (e.g. loading a database)
    }

    String value() {
        return d;
    }
}
dart future
1个回答
5
投票

你不能让一个构造异步的。异步函数需要返回一个Future和一个构造函数需要返回类本身的实例。除非类是未来,构造函数不能是异步的(即使在当时,它不是真正的同样的事情,你不能使用async / await)。

所以,如果你的类需要异步设置,你应该提供静态工厂方法代替构造用户。我通常隐藏的构造函数即可。

class Data {
  String _d;
  Data._();
  static Future<Data> create() async {
    var data = Data._();
    await data._load();
    return data;
  }
  Future<void> _load() async {
    _d = await fn(); 
  }
  String get value => _d;
}

作为替代方案的设计,我甚至不会提上了类加载方法,只是做了手术中的静态工厂方法:

class Data {
  String _d;
  Data._(this._d);
  static Future<Data> create() async => Data._(await fn());
  String get value => _d;
}

显然,其他约束可能需要load访问的对象。

© www.soinside.com 2019 - 2024. All rights reserved.