目前是否有一种方式可以使用WebWorkers计算Dart函数?

6

我目前正在尝试在Flutter Web上运行A*搜索算法计算。

class AStarSeeker extends Seeker {
  @override
  Future<Path> Function() seek(SeekComputationInput input) {
    return () => compute(doComputation, input);
  }
}

Future<Path> doComputation(SeekComputationInput input) async
{
  return Path.empty;
}

但是我看到compute()目前在flutter web上不起作用。有没有一种方法可以使用webworker运行我的dart函数?我看到你可以运行js函数,但找不到有关dart函数的任何信息。

1个回答

4
听起来你可以在Dart中使用原始的Isolate。阅读官方文档了解有关隔离的信息,它们就像其他语言中的线程一样。
顺便说一下,这个链接可能很有帮助:Dart:在用Dart编写并在dart2js中使用的浏览器WebWorkerhttps://api.dart.dev/stable/2.16.0/dart-html/Worker-class.html 更新:
听起来隔离在Web上不起作用。那么我上面提到的“Worker”方法呢?请注意,您可以将Dart代码编译为js文件,因此即使Worker仅支持js,您仍然可以在其中执行dart。
这篇https://dev.to/kyorohiro/isolate-at-flutter-for-web-28lg听起来是一个很好的教程。
核心部分:
parent.dart

import 'dart:html' as html;

main() async {
  if(html.Worker.supported) {
      var myWorker = new html.Worker("ww.dart.js");
      myWorker.onMessage.listen((event) {
        print("main:receive: ${event.data}");
      });
      myWorker.postMessage("Hello!!");
  } else {
    print('Your browser doesn\'t support web workers.');
  }
}

child.dart

import 'dart:async';
import 'dart:html' as html;

import 'dart:js' as js;
import 'package:js/js.dart' as pjs;
import 'package:js/js_util.dart' as js_util;

@pjs.JS('self')
external dynamic get globalScopeSelf;


Stream<T> callbackToStream<J, T>(String name, T Function(J jsValue) unwrapValue) {
  var controller = StreamController<T>.broadcast(sync: true);
  js_util.setProperty(js.context['self'], name, js.allowInterop((J event) {
    controller.add(unwrapValue(event));
  }));
  return controller.stream;
}

void jsSendMessage( dynamic object, dynamic m) {
  js.context.callMethod('postMessage',[m]);
}

main() {
    callbackToStream('onmessage', (html.MessageEvent e)  {
      return js_util.getProperty(e, 'data');
    }).listen((message) {
      print('>>> ${message}');
      jsSendMessage(js.context, 'callback: ${message}');
    });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接