阻止直到字段初始化

时间:2015-05-20 15:41:37

标签: dart

尝试阻止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。

1 个答案:

答案 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​​}}触发事件或在值发生变化时完成未来的方式实现。