Dart(2.2) - 库和可见性(Libraries and visibility)

库和可见性

importlibrary指令可以帮助创建一个模块化的,可共享的代码库。库不仅提供了API,还提供隐私单元:以下划线(_)开头的标识符只对内部库可见。每个Dart app就是一个库,即使它不使用库指令。

库可以分布式使用包。见 Pub Package and Asset Manager 中有关pub(SDK中的一个包管理器)。

使用库

使用import来指定如何从一个库命名空间用于其他库的范围。

例如,Dart Web应用一般采用这个库 dart:html,可以这样导入:

import 'dart:html';

唯一需要import的参数是一个指向库的URI。对于内置库,URI中具有特殊dart: scheme。对于其他库,你可以使用文件系统路径或package: scheme。包package:scheme 指定的库通过包管理器来提供 ,例如 pub 工具

import 'package:test/test.dart';

注意: URI 代表 uniform resource identifier。 URLs (uniform resource locators) 是一种常见的 URI。

指定库前缀

如果你导入的两个库具有冲突的标识符, 则你可以使用库的前缀来区分。 例如,如果library1library2都有一个名字为 Element 的类, 你可以这样使用:

import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;

// Uses Element from lib1.
Element element1 = Element();

// Uses Element from lib2.
lib2.Element element2 = lib2.Element();

导入库的一部分

如果你只使用库的一部分功能,则可以选择需要导入的内容。例如:

// Import only foo.
import 'package:lib1/lib1.dart' show foo;

// Import all names EXCEPT foo.
import 'package:lib2/lib2.dart' hide foo;

延迟载入库

Deferred loading (也称之为 lazy loading) 可以让应用在需要的时候再加载库。 下面是一些使用延迟加载库的场景:

  • 减少 APP 的启动时间。
  • 执行 A/B 测试,例如:尝试各种算法的不同实现。
  • 加载很少使用的功能,例如可选的屏幕和对话框。

要延迟加载一个库,需要先使用deferred as来 导入:

import 'package:greetings/hello.dart' deferred as hello;

当需要使用的时候,使用库标识符调用loadLibrary()函数来加载库:

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

在前面的代码, 使用 await 关键字暂停代码执行一直到库加载完成。 关于 asyncawait 的更多信息请参考asynchrony support.

在一个库上你可以多次调用 loadLibrary() 函数。 但是该库只是载入一次。

使用延迟加载库的时候,请注意一下问题:

  • 延迟加载库的常量在导入的时候是不可用的。 只有当库加载完毕的时候,库中常量才可以使用。
  • 在导入文件的时候无法使用延迟库中的类型。 如果你需要使用类型,则考虑把接口类型移动到另外一个库中, 让两个库都分别导入这个接口库。
  • Dart 隐含的把 loadLibrary() 函数导入到使用 deferred as *的命名空间* 中。 loadLibrary() 方法返回一个 Future。

实现库

参考Create Library Packages来了解如何创建一个库并发布。

参考

Dart

你可能感兴趣的:(Dart(2.2) - 库和可见性(Libraries and visibility))