I do not completely understand the difference between part
/part of
and import
/export
when using libraries in Dart. For example:
one.dart:
library one;
part "two.dart";
Class One {
};
and
two.dart:
part of one;
import 'somefile.dart';
Class Two {
}
versus
library one;
import 'two.dart';
Class One {
}
and
library two;
import 'somefile.dart';
export 'somefile.dart';
Class Two {
}
Both scenarios seem to do the same thing. When is it advantageous to use part
and part of
rather than import
? And are there scenarios where import
will not work, but part
and part of
will?
In Dart, private members are accessible within the same library. With import you import a library and can access only its public members. With part / part of you can split one library into several files and private members are accessible for all code within these files.
Dart provides the part keyword to allow you to split code into separate files in a library. It's used in the same file as the library keyword and needs to provide a relative path to the other source files that make up the library: for example, part "functions. dart"; . You can create new, empty text files for classes.
When importing a library file from another package, use the the package: directive to specify the URI of that file. import 'package:utilities/utilities. dart'; When importing a library file from your own package, use a relative path when both files are inside of lib, or when both files are outside of lib.
update 2018/03
part
and part of
is used more and more for code generation scenarios recently (instead of deprecated transformers) and unlikely to go away anytime soon.
Packages like built_value
, json_serializable
, and many others depend on it.
Discouraged is only the patter where all files of a package are tied together to a single library by having one library file and all other files being part of that library.
original
In Dart, private members are accessible within the same library. With import
you import a library and can access only its public members. With part
/part of
you can split one library into several files and private members are accessible for all code within these files.
see clarifications to below paragraph in above update
Using part
/ part of
is discouraged and the Dart team is considering getting rid of it. I assume they will introduce something like "friend" (https://github.com/dart-lang/sdk/issues/22841), where two libraries can access each other's private members as an alternative before they discontinue part
/ part of
(maybe in a future Dart version).
Let's suppose we have a Dart library called mylib
, whose file is lib/mylib.dart
.
library mylib;
// Definitions
That library can be included in the main.dart
file as
import 'package:mypackage/mylib.dart';
When you create a new library and use other libraries you want to make available automatically when using your package, then you use export
:
library mylib;
export 'otherlib.dart';
// Definitions
You can use the show
keyword to import/export only some parts of a library (like a class or something).
You are using the part of
directive wrong here. You can't use both library
and part of
, which is used to specify the contents that belong to a library. For example, you can split your library file in more than one file (the parts):
Suppose we have in the file mylib.dart
:
library mylib;
part 'src/class1.part';
// More parts
And then we have in another file src/class1.part
the part specified in mylib.dart
part of mylib;
class Class1 {
/* ... */
}
The Creating Library Packages article on the dartlang.org site recommends avoiding 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.
The 'mini libraries' referred to are small library dart files in src
which are imported into and exported from main libraries.
using part/part of
makes many files be treated as if they were one file
import/export
doesn't, so this may be useful when private fields need to be accessed from another files (classes created on other files)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With