飞镖在构造函数上等待

时间:2019-02-06 08:22:20

标签: dart future

在此示例中,我应该使用哪种模式来加载和处理一些数据。当value返回一个值时,将d作为Future是不可接受的。如何让构造函数等待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;
    }
}

1 个答案:

答案 0 :(得分:2)

您不能使构造函数异步。 异步函数需要返回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;
}

作为一种替代设计,我什至不将load方法放在类上,而只是在静态工厂方法中进行操作:

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

显然,其他限制可能要求load有权访问该对象。

相关问题