Dart:在长时间计算期间更新 UI

Dart: update UI during long computation

我有一个小的 dart 脚本,我打算按以下方式使用它:

CanvasElement canvas;
void main() {
  canvas = querySelector('#canvas');
  querySelector('#start-button').onClick.listen((_) => work());
}

void work() {
  var state; // some state of the computation
  for (int i = 0; i < /*big number*/; i++) {
    // do some long computation
    render(state); // display intermediate result visualisation on canvas
  }
}

void render(var state) {
  canvas.context2D.... // draw on canvas based on state
}

这是监听点击一个按钮并在该点击上执行一些长时间的计算,并根据该计算在 canvas 实时显示一些中间结果作为计算的进展。

但是,这不起作用 - canvas 在整个计算完成后仅更新一次。

这是为什么?我应该如何安排我的代码以实时响应的方式工作?

其中一个解决方案是将您的长计算的一部分放入 dart 的 event loop,即通过立即等待未来来排队计算 return。

请参阅 sample on DartPad

但是如果你有很多繁重的计算,我认为最好启动一个新的 isolate 并与它交流它的状态。

更新

这里是差不多,不完全一样的工作函数,重写了没有使用await,也许它是如何工作的会更清楚一点:

for (int i = 0; i < 200; i++) {
  new Future(()=>compute(i)).then((double result)=>render(i+result*50));
}

在这里,我们实际上创建了 200 个 futures,将它们排入事件循环(Future 构造函数执行此操作),并为每个 futures 注册一个个人回调。