Dart:如何在导入的包中指定Isolate URI?

我已经写了一些代码,我想在一个包中提供它,但我想将它作为一个worker暴露给包消费者.为此,我创建了一个包装类,它在内部运行隔离,并使用send命令和侦听器与Isolate通信以提供功能.

当我想在bin或web目录中使用这个包装类时会出现问题:提供的Uri是从running / main Isolate的目录而不是从包根目录中插入的.对于bin,它是packagename | bin /,对于web,它是packagename | web.

我想将这个类导出给消费者,这样他们可以选择比构建自己的Isolate更简单的方法,但我不知道如何指定将在spawnUri中使用的主文件.

有没有办法指定文件,因此无论运行主Isolate的位置如何,它都将始终解析为正确的文件.

结构体:

// Exports the next file so the class in it will be package visible 
packageroot -> lib/package_exports_code_that_spawns_isolate.dart
// This file should contain URI that always resolve to the next file
packageroot -> lib/code_that_spawns_isolate.dart 
// The main worker/Isolate file
packageroot -> lib/src/worker/worker.dart

谢谢.

最佳答案 要引用包中的库,您应该使用包:URI.

就像是:

var workerUri = Uri.parse("package:myPackage/src/worker/worker.dart");
var isolate = await Isolate.spawnUri(workerUri,...);

它并不完美,因为它要求您将软件包名称硬连接到代码中,但我相信它是目前可用的最佳选择.

Isolate.spawnUri函数不会(也不能)解析相对URI引用wrt.调用它的源文件 – Dart库中没有任何内容取决于它的调用位置,这太简单了 – 所以相对URI不起作用.引用您的worker的唯一绝对URI是一个包:URI,因此您必须使用它.

点赞