Mik*_*ink 6 web-worker dart dart-isolates flutter
我目前正在尝试在 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;
}
Run Code Online (Sandbox Code Playgroud)
但我读到,compute() 目前不适用于 flutter web。有没有办法让我可以使用网络工作者运行我的 dart 函数?我读到你可以运行 js 函数,但找不到任何有关 dart 函数的信息。
听起来你可以Isolate在 Dart 中使用 raw 。阅读有关隔离的官方文档,隔离就像其他语言中的线程一样。
顺便说一句,这个链接可能会有所帮助: Dart:在浏览器中用 dart 编写的 webworker 并在 dart2js和https://api.dart.dev/stable/2.16.0/dart-html/Worker-class.html中使用
更新
听起来隔离在网络中不起作用。那么我上面提到的“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}');
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1986 次 |
| 最近记录: |