尝试阻止setter中的执行,直到字段值发生变化,我知道它会在几微秒内发生变化,以证明我写的问题:
import 'dart:async';
void main() {
new Timer.periodic(new Duration(seconds:1),(t)=>print(Store.x));
new Timer.periodic(new Duration(seconds:3),(t)=>Store.x='initialized');
}
class Store{
static String _x = null;
static set x(v) => _x=v;
static get x{
//how do i block here until x is initialized
return _x;
}
}
while(x==null);
引起了stackoverflow,知道如何在setter中正确地执行此操作吗?
基本上我希望setter在初始化时返回值,它永远不会返回null。
答案 0 :(得分:1)
这无法完成。 Dart是单线程的。如果停止执行,则无法执行更新字段的代码。
如果你想要这样的东西,你需要切换到异步执行。
导入' dart:async';
void main() {
new Timer.periodic(new Duration(seconds:1),(t)=>print(Store.x));
new Timer.periodic(new Duration(seconds:3),(t)=>Store.x='initalized');
}
class Store{
static String _x = null;
static set x(v) => _x=v;
static Future<String> get x async {
while(x == null) {
await new Future.delayed(const Duration(milliseconds: 20),
}
return _x;
}
}
func someFunc() async {
var x = await new Store.x;
}
对于这个用例,我不会考虑这个Future.delayed()
好的设计。它应该以{{1}}触发事件或在值发生变化时完成未来的方式实现。