【问题标题】:Warning that 'imported libraries have the same name when they DO NOT"警告“导入的库不具有相同名称”
【发布时间】:2013-05-22 15:20:21
【问题描述】:

我在一个类中有以下导入语句

import 'package:dart_web_toolkit/ui.dart';

import '../../util/flex_table_builder.dart' as ftBldr;

import '../factors_list_view.dart';


class MediatingFactorsView extends Composite
{
 //... 
}

但是,最后一个导入语句带有警告标记:

The different imported libraries 'flex_table_builder.dart' and 'factors_list_view.dart' should not have the same name

名称完全不同,在我更新到最新的 Dart 编辑器后,我发现这在我的代码中重复出现。这是一个错误吗?

【问题讨论】:

  • 库名是什么?
  • 上面唯一使用的库是第一个库名为 dart_web_toolkit 的导入。另外两个导入是我创建的本地 dart src 文件。

标签: dart


【解决方案1】:

确保为每个文件分配库名称。文件的第一行应该是:

library foo;

您应该为您使用的每个库使用不同的名称。库名称由library 指令指定,但匿名库被视为具有相同名称,这就是警告的来源。

Dart specification 中的警告是要导入两个同名的库。

您可以在language tour. 中阅读有关如何使用库的更多信息

【讨论】:

  • 很高兴为您提供帮助 :) 如果问题已解决,请将答案标记为已解决。
  • 非常感谢。但是这个问题只是在我更新到当前的 Dart 编辑器之后才出现的。以前一切都很好。另一件事是上面的第二个和第三个导入不是库,它们是我在 lib 目录之外创建的 dart 源文件。您是否仍然认为我应该将所有文件放在特定的库中。我已经尝试过这样做,但是尽管我在生成的包中看到了库名称,但每当我尝试以标准方式引用它们时,代码总是会失败。感谢您的帮助。
  • 由你来决定它们在逻辑上是它们自己的库还是你的主库的一部分(你想在不同的库中重用代码吗?)。如果它们不是自己的库,则无需导入任何内容。
  • 在我的更新之前,一切正常。我想知道我是否做错了什么。即使两个 .dart 文件存在于同一个目录中,我也必须有一个导入语句才能引用该文件而不会出现错误。是否有另一种机制来做到这一点?谢谢
  • 最新更新包含对可能未检查库命名冲突的新分析器的更新/修复。每当您使用“导入”时,它都会导入一个库。这个库应该有一个声明的库(例外是你的 main() 函数的文件)。请参阅有关如何将两个文件与导入或部分组合的问题:stackoverflow.com/questions/12951989/…
【解决方案2】:

您可以关注Package layout conventions

对于错误:

不同的导入库 onset_view.dart 和 duration_view.dart 不能同名

您应该在每个导入的 dart 文件中定义不同的名称。

补充一点,您应该使用import 'package:epimss/shared.dart'; 而不是import 'packages/epimss/shared.dart';import 'site_view.dart'; 而不是import './site_view.dart';

【讨论】:

  • 感谢一百万亚历山大。您的回答非常有帮助和赞赏。
【解决方案3】:

警告正确地表明存在问题。

正确的解决方案取决于 Dart 文件在概念上是相互独立还是相关。

不同的库

如果它们在概念上是分开的,那么它们应该被定义为属于具有不同库名称的不同库。

import 命令用于引用来自不同 库的编译单元,而不是属于相同 库的编译单元。它希望每个库都有一个唯一的库名称。

如果 Dart 文件被视为库(即是 import 语句的主题)并且没有显式命名,则其隐式名称为空字符串。在这种情况下,两个文件都被视为库,它抱怨有两个同名的库(空字符串)。

为了让它作为单独的库工作,给它们不同的名字:

顶部文件:

import 'foo.dart';
import 'bar.dart';

foo.dart:

library foo;

bar.dart:

library bar;

同一个库的一部分

但如果它们相关,则不应将它们作为库引用。也就是说,不要使用 import 命令。使用part 命令,它将 Dart 文件视为属于 same 库的编译单元。

顶部文件:

library baz;
part 'foo.dart';
part 'bar.dart';

foo.dart:

part of baz;

bar.dart:

part of baz;

只有顶级库文件可以包含part 语句。您不需要(也不能有)其他文件中的part 语句,即使它们相互引用定义。如果有多个文件,只需将它们全部列在顶层库文件中(以任何顺序)。

虽然库的隐式名称是空字符串,但在涉及多个部分时无法使用它:因此即使这些文件永远不会作为库导入,您仍然需要显式为其分配一个库名称。

永远记住:importpart 语句与 C 预处理器中的 #include 宏有很大不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多