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

相關文章
相關標籤/搜索