飞镖等待构造函数
dart await on constructor
在这个例子中我应该使用什么模式来加载和处理一些数据。作为 value
returns 一个值,将 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;
}
}
您不能使构造函数异步。
异步函数需要 return 一个 Future
,构造函数需要 return class 本身的一个实例。除非 class 是 未来,否则构造函数不能是异步的(即使那样,它也不是一回事,你不能使用 async
/ await
).
因此,如果您的 class 需要异步设置,您应该为用户提供 静态工厂方法 而不是构造函数。我通常会隐藏构造函数。
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上,直接在静态工厂方法中操作:
class Data {
String _d;
Data._(this._d);
static Future<Data> create() async => Data._(await fn());
String get value => _d;
}
显然,其他约束可能要求 load
有权访问该对象。
在这个例子中我应该使用什么模式来加载和处理一些数据。作为 value
returns 一个值,将 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;
}
}
您不能使构造函数异步。
异步函数需要 return 一个 Future
,构造函数需要 return class 本身的一个实例。除非 class 是 未来,否则构造函数不能是异步的(即使那样,它也不是一回事,你不能使用 async
/ await
).
因此,如果您的 class 需要异步设置,您应该为用户提供 静态工厂方法 而不是构造函数。我通常会隐藏构造函数。
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上,直接在静态工厂方法中操作:
class Data {
String _d;
Data._(this._d);
static Future<Data> create() async => Data._(await fn());
String get value => _d;
}
显然,其他约束可能要求 load
有权访问该对象。