5

我已经编写了一些代码,我想在一个包中提供它,但我也想将它作为工人公开给包消费者。为此,我创建了一个包装类,它在内部运行隔离并使用发送命令和侦听器与隔离通信以提供功能。

当我想从binorweb目录中使用这个包装类时,问题就出现了: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

谢谢。

4

1 回答 1

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 不起作用。唯一引用您的工作人员的绝对 URI 是package:URI,因此您必须使用它。

于 2016-05-10T07:16:52.940 回答