Dart之旅09: 库和可见性

importlibrary指令可以帮你创建模块化和可共享的代码。库不仅提供API,也可以有私有化的元素。使用下划线开始的标识符只在库中可见。每个dart app都是一个库,即使没有使用library指令。

库可以使用package进行分发。参考Pub Package and Asset Manager。

使用库

使用import关键字来指定其他库:

import 'dart:html';

对于内置库,要使用dart: scheme,对于其他库要使用package: scheme。例如:

import 'package:test/test.dart';

指定库前缀

如果你的两个库里面有相同的标识符,那么可以使用as来指定命名空间。类似C++的namespace

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;

懒加载一个库

延迟加载(也叫懒加载)是指一个应用可以按需加载一个库。下面是你可能使用它的一些情景:

  • 减少app的启动时间
  • 执行A/B测试,例如替代算法实现
  • 加载很少使用的方法,例如一些可选的界面和弹窗

要想懒加载一个库,你必须使用deferred as

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

当你需要使用这个库的时候,你需要使用库标识符调用loadLibrary()方法:

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

你可以多次调用loadLibrary(),懒加载只会加载一次,后续的加载都会使用缓存中的内容,而不是再次加载。

使用延迟加载时需要记住以下几点:

  • 一个延迟库的常量也不存在,直到这个库被加载
  • 你不能使用一个导入延迟库的dart文件中导入的延迟库里面的类型。取而代之的是你可以在导入延迟库的dart文件中公开一个导入方法的接口
  • Dart隐式地添加了loadLibrary()方法到deferred as命名空间,这个方法返回了一个Future

Dart VM有时候会允许你在调用loadLibrary()之前访问延迟库的变量。但不要依赖这种特性,很可能在后续版本里面就会被改掉。

实现一个库

参考Create Library Packages,它包含了:

  • 如何组织库代码
  • 如何使用export指令
  • 何时使用part指令
  • 何时使用library指令

你可能感兴趣的:(Dart之旅09: 库和可见性)