我已经编写了一些代码,我想在一个包中提供它,但是我想将它作为一个worker暴露给包消费者。为此,我创建了一个包装类,它在内部运行隔离,并使用send命令和侦听器与Isolate通信以提供功能。
当我想使用bin
或web
目录中的这个包装类时出现问题:提供的Uri
是从running / main Isolate
的目录中插入的而不是从包根。 bin
为packagename|bin/
,web
为packagename|web
。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
。
我想将此类导出给消费者,以便他们可以选择比构建自己的for(int x =0; x< cartas.length;x++)
{
if(cartas[x].isEnabled()) //enabled
{
break; //a button is still enabled so cancel loop
}
else if(x == cartas.length-1&& !cartas[x].isEnabled())
{
//All cards have been disabled. Do Something.
}
}
更简单的方法,但我不确定如何指定将在spawnUri中使用的主文件。 / p>
有没有办法指定文件,因此无论运行主隔离的位置如何,它都将始终解析为正确的文件。
结构:
isEnabled();
感谢。
答案 0 :(得分:2)
要引用包中的库,您应该使用package:
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是package:
URI,因此您必须使用它。