9.Libraries and visibility 库和可见性

import和liabrary指令能够帮助你建立模块化,可复用的代码。库不单单提供API,也是一个私有化单元:库中已下划线(_)开头的类都是对外不可访问的。每一个Dart的应用也是一个包,尽管它没有使用包的声明。html

库都采用包的形式发布。具体看 Pub Package and Asset Managerweb

Using libraries 库的使用

使用import关键字引入库中的资源。async

下面的例子中,表示了Dart web 应用须要使用dart:html 库ide

import 'dart:html';

在Dart的内置库中,你能够直接使用dart:schema来引入。其它的库,你可使用文件路径或者package:scheme方式。其中package:scheme使用的包发布工具发布的代码。
import 'package:test/test.dart';
注意:URI是统一资源标识,URL是URI的一种,模块化

Specifying a library prefix 指定库使用前缀工具

若是你导入两个库,它们有相同的类,你可使用其中一个库增长前缀使用标识.·测试

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();
Importing only part of a library
If you want to use only part of a library, you can selectively import the library. For example:

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

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

Lazily loading a library 懒加载

Deferred loading容许应用你在须要时,在后台加载库。下面是须要使用到 deferred的场景ui

  • 减小APP的启动事件
  • 进行A/B 测试,
  • 用于加载少用的类,能够节省资源,好比可选的界面和弹出框,
import 'package:greetings/hello.dart' deferred as hello;

当你须要用它时,使用loadLibrary().spa

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

在上面的代码中,await 暂停程序执行,直至包加载完。若是想了解关于 async 和 await更多信息,请看asynchrony support.code

你能够屡次调用loadLibrary,可是库只会让你加载一次。

以下是deferred使用的一些原则:

  • 不可以使用经过deferred导入库的常量,由于它只有在loadLiabary后才建立

  • 不可以使用经过deferred导入库的类,能够将类定义为接口经过import导入,具体实现经过deferred导入

  • Dart implicitly inserts loadLibrary() into the namespace that you define using deferred as namespace. The loadLibrary() function returns a Future.(没看太懂,和理解的有冲突)

DartVM 不一样:DartVM在loadLibrary以前容许使用库中的变量,可是这种作法不建议使用,可能后期会改变这种机制

Implementing libraries 建立库

详细请看Create Library Packages

相关文章
相关标签/搜索