静态最终对象改变身份

时间:2018-02-18 16:45:59

标签: dart final

我有一个用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匹配。

1 个答案:

答案 0 :(得分:1)

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

你的"主要"将文件放在包lib目录中,并使用相对路径导入资源文件吗?如果是这样,请尝试将该导入更改为package:packageName/thepath URI,并查看它是否发生了任何变化。

(我个人的建议是永远不要有包含lib的Dart库URL,无论是在导入/导出还是在命令行上。在这种情况下总是使用package: URI。)