9.Libraries and visibility 库和可见性

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

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

Using libraries 库的使用

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

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

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的场景

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

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

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

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

你可以多次调用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

posted @ 2019-01-10 09:19  lowezheng  阅读(314)  评论(0编辑  收藏  举报