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

标签 dart html5-canvas

我有一个小 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 ,即通过等待它立即返回的 future 来排队计算。

请参阅 sample on DartPad .

但是如果你有很多繁重的计算,我认为最好开始一个新的隔离并与它沟通它的状态。

更新

这是几乎,不完全相同的工作函数,没有使用 await 重写,也许它会更清楚它是如何工作的:

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

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

关于Dart:在长时间计算期间更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31067297/

相关文章:

javascript - 在时钟中以五分钟为间隔绘制指标

javascript - HTML5 Canvas 中最简单的幻灯片,canvas.context.clearRect 不适用于 setTimeout

ios - 在 iOS Flutter 中构建版本时出现此错误

flutter - 从第二个屏幕导航返回时关闭AlertDialog并刷新页面 float

javascript - 将多个 Canvas 合并到一个 div 中并将它们全部组合到一个 Canvas 中

python - 我可以有一个带有破折号的交互式 html5 Canvas 吗?

javascript - 在 Javascript 中绘制可缩放的音频波形时间轴

android - 如何使用特定于平台的代码与 Flutter 应用共享图像?

Flutter 什么是 StatefulHookWidget 以及我们如何使用它?

dart - 如何使用 CupertinoTabBar 切换选项卡?与 Material 选项卡栏不同,我们没有选项卡 Controller 来切换选项卡