愿你坚持不懈,努力进步,进阶成自己理想的人

—— 2017.09, 写给3年后的自己

Dart学习笔记(七):库

在Dart中,可以使用importlibrary创建模块化的可分享代码。Dart库具有如下一些基本概念:

  • 在库里面,以_开头的标识符仅在库内部可见
  • 每个Dart程序都是一个库,即使没有使用library命名,也是一个库
  • 库可以使用Dart package工具部署

一、库的使用

可以使用import来指定一个库该如何使用另一个库,如:

import 'dart:html';

其中:

  • import必须传入参数,参数为库的URI
  • 对于内置的库,使用dart:开头作为库的URI,如dart:io
  • 对于其他的库,可以使用文件系统路径,或者使用package:开头的方式作为库的URI


二、库的前缀

现在,假设有两个库,他们内部含有同样的标识符,那么这种情况下可以使用import ... as ...语法,如下:

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

Element element1 = new Element();
lib2.Element element2 = new lib2.Element();


三、部分导入

如果只使用库的一部分功能,可以使用部分导入,如下:

// 只导入foo
import 'package:lib1/lib1.dart' show foo;

// 导入全部(除了foo)
import 'package:lib2/lib2.dart' hide foo;


四、延迟导入

延迟导入可以实现在应用需要的时候再加载,一般有这些场景:

  • 减少APP的启动时间
  • 执行A/B测试,如尝试各种算法的不同实现
  • 加载很少使用的功能

延迟导入的语法是import ... deferred as ...,使用时则使用loadLibrary()来加载库,例子如下:

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

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

需要注意的是:

  • 延迟加载库的常量在导入时是不可用的,只有当库加载完毕时,库中的常量才可用
  • 导入延迟库的时候,库中的类型是无法使用的
  • Dart隐含地把id.loadLibrary()的结果赋值给deferred as id中的id