【问题标题】:Is there currently a way to compute a dart function with webworkers?目前有没有办法用网络工作者计算飞镖函数?
【发布时间】:2022-01-27 14:41:59
【问题描述】:

我目前正在尝试在 Flutter Web 上运行 A* seek 计算

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。有没有办法可以让网络工作者运行我的飞镖功能?我读到您可以运行 js 函数,但找不到有关 dart 函数的任何信息。

【问题讨论】:

    标签: flutter dart web-worker dart-isolates


    【解决方案1】:

    听起来你可以在 Dart 中使用原始的Isolates。阅读关于隔离的官方文档,隔离就像其他语言中的线程。

    顺便说一下,此链接可能会有所帮助:Dart: in browser webworker written in dart and used in dart2jshttps://api.dart.dev/stable/2.16.0/dart-html/Worker-class.html

    更新

    听起来隔离在 web 中不起作用。那么我上面提到的“工人”方法呢?请注意,您始终可以将 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}');
        });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-14
      • 2021-10-03
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 2016-04-13
      相关资源
      最近更新 更多