何时在 Dart 中使用 part/part 与 import/export?

When to use part/part of versus import/export in Dart?

我不完全理解在 Dart 中使用库时 part/part ofimport/export 之间的区别。例如:

one.dart:
library one;
part "two.dart";
Class One {
};

two.dart:
part of one;
import 'somefile.dart';
Class Two {
}

对比

library one;
import 'two.dart';
Class One {
}

library two;
import 'somefile.dart';
export 'somefile.dart';
Class Two {
}

两种情况似乎都在做同样的事情。什么时候使用 partpart ofimport 更有利?是否存在 import 不起作用但 partpart of 起作用的情况?

假设我们有一个名为 mylib 的 Dart ,其文件是 lib/mylib.dart.

library mylib;

// Definitions

该库可以作为

包含在 main.dart 文件中
import 'package:mypackage/mylib.dart';

当您创建一个新库并使用您希望在使用您的包时自动提供的其他库时,您可以使用 export:

library mylib;

export 'otherlib.dart';

// Definitions

您可以使用 show 关键字仅 import/export 库的某些部分(例如 class 或其他内容)。


您在这里使用的 part of 指令有误。您不能同时使用 librarypart of,它们用于指定属于库的内容。例如,您可以将库文件拆分为多个文件(部分):

假设我们在文件中有 mylib.dart:

library mylib;

part 'src/class1.part';
// More parts

然后我们在另一个文件 src/class1.part 中有 mylib.dart

中指定的部分
part of mylib;

class Class1 { 
  /* ... */
}

2018/03 更新

partpart of 最近越来越多地用于代码生成场景(而不是弃用的转换器)并且不太可能很快消失。

built_valuejson_serializable 等软件包以及许多其他软件包都依赖于它。

唯一令人气馁的是,通过让一个库文件和所有其他文件成为该库的一部分,将一个包的所有文件绑定到一个库。

原创

在 Dart 中,私有成员可以在同一个库中访问。使用 import 您可以导入一个库并且只能访问它的 public 成员。使用 part/part of,您可以将一个库拆分为多个文件,这些文件中的所有代码都可以访问私有成员。

请参阅以上更新中对以下段落的说明

不鼓励使用 part / part of,Dart 团队正在考虑摆脱它。我假设他们会引入类似 "friend" (https://github.com/dart-lang/sdk/issues/22841) 的东西,其中两个库可以在它们停止 part / part of(也许在一个未来的 Dart 版本)。

dartlang.org 站点上的 Creating Library Packages 文章建议避免 part / part of

Note: You may have heard of the part directive, which allows you to split a library into multiple Dart files. We recommend that you avoid using part and create mini libraries instead.

所指的'mini libraries'是src中的小型库dart文件,它们是从主库导入和导出的。

使用 part/part of 可以将多个文件视为一个文件

import/export 没有,所以当需要从另一个文件访问私有字段时这可能很有用(类 在其他文件上创建)