库和可见性

使用import和library机制可以帮你创建一个模块和可分享的代码。

库可以提供API,但是以_开头定义的变量或者方法只能在库内部使用。

每一个Dart的App都是一个库,即使它没有用Library机制。

  • 库的声明

Dart2中的库可以用library来声明库的名字,也可以不用。

library hello;
  • 库的引入

使用import关键字引入库。引入库有如下三种方式:

1. 引入同库文件,直接使用库的路径: import "Path/name.dart";

2. 引入Dart语言内部的库,路径前需要添加dart: imprrt "dart:html";

3. 引入第三方库,路径前需要添加package: import "package:Path/name.dart"。

引入的库可以用as来重命名,防止不同的库变量名冲突。当使用了别名,那么在调用引入的库中的对象时,需要带着别名,如:asName.ClassName。

使用show和hide关键字,可以单独引入或者剔除库中的某一个API。

import "hello.dart"; // 引入同目录下的hello.dart文件
import "http://xxx/xx.dart"; // 也可是url,但是不推荐
import "dart:html"; // 引入Dart2中的html库
import "package:lib1/lib1.dart"; // 引入lib1包下的lib1.dart
import "package:lib2/lib2.dart" as lib2; // 引入lib2包下的lib2.dart, 并重命名为lib2
import "package:lib3.dart" show Foo; // 只引入lib3.dart中的Foo对象
import "package:lib4.dart" hide Foo; // 除了Foo对象,引入其他所有lib4.dart中的对象
// 使用Element 来自lib1
Element element1 = Element();

// 使用Element 来自lib2
lib2.Element element2 = lib2.Element();
  • 库的拆分 

我可以将一个比较大的库文件拆成几个比较小的文件,这些文件可以通过part关联。每一个part关联的文件,它们之间共享所有的命名空间,同时共享所有的对象,包括私有的对象。

如果使用了part拆分,库必须使用library声明。

PS: part的引入文件,也可以使用url但是不推荐。如: part "http://xxx/xx.dart";

// 创建文件test.dart
library testall;
import "dart:html";

part("test1.dart"); // 关联test1.dart文件
part("test2.dart");

// 创建test1.dart
part of testall; // 声明是testall的一部分,不必再引入dart:html,可以直接使用

// 创建test2.dart
part of testall; // 声明是testall的一部分
  • 延迟加载

使用deferred as 关键字,可以实现库的延迟加载。使用loadLibrary()进行加载,可以多次调用,但是只会执行一次,它返回一个Future对象。

为什么使用延迟加载?

1. 减少APP的启动时间;

2. 延迟加载很少使用的功能

import 'package:greetings/hello.dart' deferred as hello; // 延迟加载的声明,默认重命名

Future greet() async {
  await hello.loadLibrary();
  hello.printGreeting();
}

 

如何创建库暂时不在本章讨论,可以参考官方文档。

你可能感兴趣的:(dart2,教程)