我是dart的新手,并试图使用dart编写一个hello world和一个单元测试,但是我得到了错误:
duplicate top-level declaration 'METHOD main' at ../app.dart::5:6
我的项目目录是test-dart
,它有3个文件。
测试镖/ models.dart
class User {
hello(String name) {
print("Hello, ${name}");
}
}
测试镖/ app.dart
#library("app");
#source("./models.dart");
void main() {
new User().hello("app");
}
测试镖/测试/ test.dart
#library("test");
#import("../app.dart");
void main() {
print("hello, test");
}
现在void main()
上的“test.dart”出现错误,错误消息为:
duplicate top-level declaration 'METHOD main' at ../app.dart::5:6
两个main()
方法在不同的库中,为什么它们仍然重复?如何解决?
答案 0 :(得分:6)
如果您导入类似#import('../app.dart)
的库,那么app.dart
中的所有名称都会在导入代码中显示(所有公共名称,实际上 - 那些不要以_
开头。因此,在您的test.dart
库中,您现在可以看到两个main
个函数。这显然是一次碰撞。有两种方法可以解决它(我知道)。
首先:使用前缀导入库,如下所示:#import('../app.dart', prefix: 'app')
。然后,来自app.dart
的所有公开名称仍然可见,但只有app
前缀,因此来自main
的{{1}}功能只能由app.dart
访问。这里没有冲突,但每次都必须使用前缀。
第二:使用app.main
组合器,如下所示:show
。然后,来自#import('../app.dart', show: ['a', 'b'])
的所有名称都不可见,只有那些明确命名的(app.dart
和a
)。不过,我不确定这是否已经实施。
也许在将来,我们会得到与b
组合器相反的东西,以便您可以show
。这将是您的问题的最佳解决方案,但它不是当前语言(由0.09指定)。
答案 1 :(得分:5)
您正在导入没有前缀的app.dart,这意味着如果存在重复项(如示例中),则导入和导入的库的符号可能会发生冲突。
要解决这些冲突,库导入允许您使用标识符为导入添加前缀。如果您按如下方式更改test.dart,则示例应该有效:
#library("test");
#import("../app.dart", prefix: "app");
void main() {
print("hello, test");
app.main();
new app.User().hello("main");
}
注意现在如何使用“app”前缀访问app.dart库中的类和顶级函数,因此不会与test.dart中的名称冲突。