静态最终对象改变身份

static final object changes identity

我有一个用 Dart 编写的浏览器应用程序。我注意到一个奇怪的错误出现在我的 StageXL ResourceManager 缺少它以前拥有的资源的地方。程序调试了一段时间后,我遇到了这样的情况:

在global.dart中:

class Global {
    static final ResourceManager resourceManager = new ResourceManager();
}

在主函数中:

var resources = Global.resourceManager;
resources.addBitmapData("Player", "images/player_base.png");
await resources.load();
print("in main: ${identityHashCode(Global.resourceManager)} = "
    " ${Global.resourceManager.resources}, isolate: ${identityHashCode(
    Isolate.current)}");

在我之后需要访问资源的另一个函数中:

print("elsewhere: ${identityHashCode(Global.resourceManager)} = "
    " ${Global.resourceManager.resources}, isolate: ${identityHashCode(
    Isolate.current)}");

预期输出(identityHashCodes 匹配,对象内容也匹配):

in main: 12345678 = [ResourceManagerResource [kind=BitmapData, name=Player, 
    url = images/player_base.png]], isolate: 09876543
elsewhere: 12345678 = [ResourceManagerResource [kind=BitmapData, 
    name=Player, url = images/player_base.png]], isolate: 09876543

实际输出(注意identityHashCode不匹配):

in main: 516570559 = [ResourceManagerResource 
    [kind=BitmapData, name=Player, url = images/player_base.png]],
    isolate: 843028171
elsewhere: 419835243 = [], isolate: 843028171

我认为这可能与 运行 在不同的隔离区(不熟悉它们)有关,但如您所见,当前隔离区的 identityHashCodes 匹配。

真令人惊讶。我最好的猜测是您使用不同的 URI 两次导入同一个库。您的一个文件是 "main" 文件这一事实支持这一点,因为在命令行上将主文件指定为文件并让它使用相对引用导入包库是一个常见的错误。

您的 "main" 文件是否在包 lib 目录中,它是否使用相对路径导入资源文件?如果是这样,请尝试将该导入更改为 package:packageName/thepath URI,看看它是否改变了什么。

(我个人的建议是永远不要使用包含 lib 的 Dart 库 URL,无论是在 import/export 中还是在命令行中。始终使用 package: 在这种情况下改为 URI。)