目次

ライブラリとインポート

importlibraryディレクティブは、モジュール化され、共有可能なコードベースを作成するのに役立ちます。ライブラリはAPIを提供するだけでなく、プライバシーの単位でもあります。アンダースコア(_)で始まる識別子は、ライブラリ内でのみ表示されます。すべてのDartファイル(とそのパーツ)はライブラリですlibraryディレクティブを使用していない場合でも同様です。

ライブラリはパッケージを使用して配布できます。

ライブラリの使用

#

importを使用して、あるライブラリの名前空間が別のライブラリのスコープで使用される方法を指定します。

たとえば、Dart Webアプリは一般的にdart:htmlライブラリを使用しますが、これは次のようにインポートできます。

dart
import 'dart:html';

importで必須の引数は、ライブラリを指定するURIだけです。組み込みライブラリの場合、URIは特別なdart:スキームを使用します。その他のライブラリでは、ファイルシステムパスまたはpackage:スキームを使用できます。package:スキームは、pubツールなどのパッケージマネージャーによって提供されるライブラリを指定します。たとえば

dart
import 'package:test/test.dart';

ライブラリプレフィックスの指定

#

競合する識別子を持つ2つのライブラリをインポートする場合、一方または両方のライブラリにプレフィックスを指定できます。たとえば、library1とlibrary2の両方にElementクラスがある場合、次のようになります。

dart
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();

ライブラリの一部のみのインポート

#

ライブラリの一部のみを使用する場合は、ライブラリを選択的にインポートできます。たとえば

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

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

ライブラリの遅延読み込み

#

遅延読み込み遅延ロードとも呼ばれる)により、Webアプリは必要になった場合にオンデマンドでライブラリを読み込むことができます。次のニーズの1つ以上を満たす必要がある場合に、遅延読み込みを使用します。

  • Webアプリの初期起動時間を短縮する。
  • A/Bテストを実行する(たとえば、アルゴリズムの代替実装を試す)。
  • オプションの画面やダイアログなど、めったに使用されない機能を読み込む。

これは、Dartが起動時にすべての遅延コンポーネントを読み込むという意味ではありません。Webアプリは、必要に応じてWeb経由で遅延コンポーネントをダウンロードできます。

dartツールは、Web以外のターゲットの遅延読み込みをサポートしていません。Flutterアプリを構築している場合は、Flutterガイドの遅延コンポーネントに関する説明を参照してください。

ライブラリを遅延読み込みするには、最初にdeferred asを使用してインポートします。

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

ライブラリが必要になったら、ライブラリの識別子を使用してloadLibrary()を呼び出します。

dart
Future<void> greet() async {
  await hello.loadLibrary();
  hello.printGreeting();
}

上記のコードでは、awaitキーワードは、ライブラリが読み込まれるまで実行を一時停止します。asyncawaitの詳細については、非同期サポートを参照してください。

ライブラリでloadLibrary()を複数回呼び出しても問題ありません。ライブラリは1回だけ読み込まれます。

遅延読み込みを使用する際の注意事項

  • 遅延ライブラリの定数は、インポートファイルでは定数ではありません。これらの定数は、遅延ライブラリが読み込まれるまで存在しません。
  • インポートファイルでは、遅延ライブラリの型を使用できません。代わりに、インターフェース型を、遅延ライブラリとインポートファイルの両方によってインポートされるライブラリに移動することを検討してください。
  • Dartは、deferred as namespaceを使用して定義した名前空間にloadLibrary()を暗黙的に挿入します。loadLibrary()関数はFutureを返します。

libraryディレクティブ

#

ライブラリレベルのドキュメントコメントまたはメタデータアノテーションを指定するには、ファイルの先頭でlibrary宣言にそれらを添付します。

dart
/// A really great test library.
@TestOn('browser')
library;

ライブラリのインプリメント

#

パッケージの作成には、次の情報が含まれています。

  • ライブラリソースコードの構成方法。
  • exportディレクティブの使用方法。
  • partディレクティブを使用する場合。
  • 複数のプラットフォームをサポートするライブラリを実装するための条件付きインポートとエクスポートの使用方法。