Dart 静态最终对象更改标识

Dart 静态最终对象更改标识,dart,final,Dart,Final,我有一个用Dart编写的浏览器应用程序。我注意到出现了一个奇怪的错误,我的StageXL ResourceManager丢失了它以前拥有的资源。调试程序一段时间后,我遇到了这样的情况: 在global.dart中: class Global { static final ResourceManager resourceManager = new ResourceManager(); } 在主要功能方面: var resources = Global.resourceManager; r

我有一个用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匹配,对象内容也匹配):

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


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

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

您的“主”文件是否位于包
lib
目录中,它是否使用相对路径导入资源文件?如果是这样,请尝试将该导入更改为
包:packageName/thepath
URI,然后查看是否有任何更改


(我个人的建议是,无论是在导入/导出中还是在命令行上,都不要让Dart库URL包含
lib
。在这种情况下,请始终使用
包:
URI。)

不要回答问题
Global.resourceManager
us final,
Global.resourceManager.resources
仍然可以更改。请注意,Global.resourceManager也会更改其标识,如identityHashCode所示。“resourceManager.resources”的更改实际上是无关紧要的。谢谢您的建议!我无法使用我的自动取款机,但我会尽快给你回复我的结果。好吧,原来这就是问题所在。我无法表达你为我节省了多少时间!修复此问题还修复了其他3个随机错误!有人提到“包”导入对dart2js编译器不好,这就是为什么我在任何地方都使用它们!。这个问题值得向Dart团队报告吗?似乎不管导入方法如何,它都应该工作。这是Dart团队的一个众所周知的问题。Dart语言规范标识符库及其导入时使用的URI。只要不意外地导入带有非
包:
URI的包库,就可以避免重复库。不过,这种情况偶尔也会发生,尤其是当包中的
main
文件通过相对导入访问真实的包库时。这不容易检测,因为你不能总是看到一个文件是否打算作为“主”文件,但我认为我们可以在启发式检测这样的问题上做得更好。非常感谢!我想知道为什么我的单身汉不工作!
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
in main: 516570559 = [ResourceManagerResource 
    [kind=BitmapData, name=Player, url = images/player_base.png]],
    isolate: 843028171
elsewhere: 419835243 = [], isolate: 843028171