0

我认为我不理解此错误消息。这是否意味着 my_file.dart 已经来自另一个文件,例如 my_main.dart 包含:

#source('my_file.dart');

所以 my_file.dart 不能获取其他文件?例如在 my_file.dart 中。

#source('my_other_file.dart'); // this can't be here?

class MyClass {
  Collection<MyOtherClass> myVariables;
}

问题是,我必须在 my_file.dart 中获取 my_other_file.dart,因为如果我不这样做,它会为 my_other_file.dart 中的类提供有关“没有这种类型”的错误。但是当我这样做时,我得到了标题错误,“这个源代码是通过 #source 指令包含在 my_file.dart 中的,所以它本身不能包含指令”。

我是否完全误解了这条信息?如何使这些错误停止?

4

2 回答 2

3

你的理解是对的,一个#source-d文件不能是#source其他文件。

但让我们更深入一点:Dart 支持库。例如,如果您在服务器上使用 Dart,您很可能会使用该dart:io库(通过编写#import('dart:io')代码)。如果您在浏览器中使用 Dart,您很可能会使用该dart:html库。该dart:core库在每个程序中都隐式导入。

您当然可以编写自己的库。在几乎所有情况下,一个库将跨越多个文件。在这种情况下,其中一个文件会有点main:它将声明库(使用#library),指定所有依赖项(使用#import)和所有其他源文件(使用#source)。所有其他文件(那些#source-d 文件)将只包含 Dart 代码,并且它们都不能包含这些#library,#import#source指令。它看起来像这样:

my_lib.dart:

#library('My Library');

#source('my_lib_impl.dart');

interface MyInterface default _MyClass {
  foo();
}

my_lib_impl.dart:

class _MyClass implements MyInterface {
  foo() {
    print("foo!");
  }
}

然后,如果你想在你的程序中使用这个库,你必须 #import使用这个my_lib.dart文件。你 #source知道。

my_program.dart:

#import('my_lib.dart');

main() {
  new MyInterface().foo();
}

请注意,即使my_program.dart不包含#library指令,它也可以像一个指令一样工作——它可以#import#source文件。您可以在“入口点”脚本中执行此操作。

我试图解释如何在 Dart 中使用库,这不是您问题的直接答案,但它应该有所帮助。如果没有,请告诉我,我会尝试更深入地挖掘。

于 2012-06-04T07:18:54.457 回答
2

Ladicek 有完整的解释。关于您的具体问题:

我必须在 my_file.dart 中获取 my_other_file.dart ,因为如果我不这样做,它会为 my_other_file.dart 中的类提供有关“没有此类类型”的错误。但是当我这样做时,我得到了标题错误,“这个源代码是通过 #source 指令包含在 my_file.dart 中的,所以它本身不能包含指令”。

解决方法是:不要放入#source('my_other_file.dart'),而是my_file.dart放入my_main.dart.

我们 Dart 团队意识到这是语言中真正令人困惑的角落之一,我们正在努力尝试想出更好的东西,但这需要时间。

于 2012-06-05T04:18:11.967 回答