Dart 註釋
Dart 支持單行註釋、多行註釋和文檔註釋。
單行註釋
單行註釋以 // 開頭。 // 和行尾之間的所有內容都被 Dart 編譯器忽略。
void main() {
// TODO: 重構為 AbstractLlamaGreetingFactory?
print('歡迎來到我的羊駝農場!');
}
多行註釋
多行註釋以 /* 開頭,以 */ 結尾。 /* 和 */ 之間的所有內容都被 Dart 編譯器忽略(除非註釋是文檔註釋;請參見下一節)。多行註釋可以嵌套。
void main() {
/*
* 這是很多工作。考慮養雞。
Llama larry = Llama();
larry.feed();
larry.exercise();
larry.clean();
*/
}
文檔註釋
文檔註釋是開頭為 /// 或 /** 的多行或單行註釋。在連續行上使用 /// 與多行文檔註釋的效果相同。
在文檔註釋中,分析器會忽略所有文本,除非它包含在方括號中。使用方括號,您可以引用類、方法、字段、頂級變量、函數和參數。方括號中的名稱在已記錄程序元素的詞法作用域中解析。
這是一個帶有對其他類和參數引用的文檔註釋示例:
/// 一種馴養的南美駱駝科動物(羊駝)。
///
/// 安第斯文化自前西班牙時代以來就一直將羊駝用作肉類和馱畜。
///
/// 與任何其他動物一樣,羊駝也需要吃東西,
/// 所以不要忘記用一些 [Food] [feed] 它們。
class Llama {
String? name;
/// 用 [food] 餵你的羊駝。
///
/// 一隻典型的羊駝每週吃一捆乾草。
void feed(Food food) {
// ...
}
/// 用 [activity] 活動讓你的羊駝鍛鍊 [timeLimit] 分鐘。
void exercise(Activity activity, int timeLimit) {
// ...
}
}
在類的生成的文檔中, [feed] 成為指向 feed 方法文檔的鏈接,
而 [Food] 成為指向 Food 類文檔的鏈接。
要解析 Dart 代碼並生成 HTML 文檔,您可以使用 Dart 的文檔生成工具, dart doc 。
有關生成的文檔示例,請參見
Dart API 文檔。
有關如何組織註釋的建議,請參見
Effective Dart:文檔。
Dart 元數據
使用元數據為代碼提供附加信息。元數據註釋以字符 @ 開頭,後跟編譯時常量的引用(例如 deprecated )或對常量構造函數的調用。
所有 Dart 代碼都可以使用四種註釋: @Deprecated 、 @deprecated 、 @override 和 @pragma 。有關使用 @override 的示例,請參閲 擴展類 。以下是如何使用 @Deprecated 註釋的示例:
class Television {
/// 使用 [turnOn] 代替打開電源。
[!@Deprecated('Use turnOn instead')!]
void activate() {
turnOn();
}
/// 打開電視電源。
void turnOn() {...}
// ···
}
如果您不想指定消息,可以使用 @deprecated 。但是,我們 建議 始終使用 @Deprecated 指定消息。
您可以定義自己的元數據註釋。以下是如何定義一個帶有兩個參數的 @Todo 註釋的示例:
class Todo {
final String who;
final String what;
const Todo(this.who, this.what);
}
以下是如何使用該 @Todo 註釋的示例:
@Todo('Dash', 'Implement this function')
void doSomething() {
print('Do something');
}
元數據可以出現在庫、類、typedef、類型參數、構造函數、工廠、函數、字段、參數或變量聲明之前,以及 import 或 export 指令之前。
Dart 庫與導入
import 和 library 指令可以幫助您創建模塊化且可共享的代碼庫。庫不僅提供 API,而且還是隱私單元:以下劃線 (_) 開頭的標識符僅在庫內可見。_每個 Dart 文件(及其部分)都是一個 庫_,即使它不使用 library 指令。
庫可以使用 包 進行分發。
注意
要了解為什麼 Dart 使用下劃線而不是public或private等訪問修飾符關鍵字,請參閲
SDK issue 33383 。
使用庫
使用 import 指定一個庫的命名空間如何在另一個庫的範圍內使用。
例如,Dart Web 應用通常使用 dart:html 庫,它們可以這樣導入:
import 'dart:html';
import 唯一必需的參數是指定庫的 URI。
對於內置庫,URI 具有特殊的 dart: 模式。
對於其他庫,您可以使用文件系統路徑或 package: 模式。 package: 模式指定由包管理器(例如 pub 工具)提供的庫。例如:
import 'package:test/test.dart';
注意
URI 代表統一資源標識符。
_URL_(統一資源定位符)是一種常見的 URI。
指定庫前綴
如果您導入了兩個具有衝突標識符的庫,則可以為一個或兩個庫指定前綴。例如,如果庫1和庫2都具有 Element 類,則您的代碼可能如下所示:
import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;
// 使用 lib1 中的 Element。
Element element1 = Element();
// 使用 lib2 中的 Element。
lib2.Element element2 = lib2.Element();
只導入庫的一部分
如果您只想使用庫的一部分,可以選擇性地導入庫。例如:
// 只導入 foo。
import 'package:lib1/lib1.dart' show foo;
// 導入除 foo 之外的所有名稱。
import 'package:lib2/lib2.dart' hide foo;
延遲加載庫
延遲加載 (也稱為 懶加載 )
允許 Web 應用根據需要按需加載庫。
當您需要滿足以下一項或多項需求時,請使用延遲加載。
- 減少 Web 應用的初始啓動時間。
- 執行 A/B 測試——例如,嘗試算法的替代實現。
- 加載很少使用的功能,例如可選屏幕和對話框。
這並不意味着 Dart 會在啓動時加載所有延遲組件。
Web 應用可以在需要時通過 Web 下載延遲組件。
dart 工具不支持針對 Web 以外的目標的延遲加載。
如果您正在構建 Flutter 應用,
請參閲 Flutter 指南中關於
延遲組件 的延遲加載實現。
undefined
要延遲加載庫,首先使用 deferred as 導入它。
import 'package:greetings/hello.dart' deferred as hello;
當您需要該庫時,使用庫的標識符調用 loadLibrary() 。
Future<void> greet() async {
await hello.loadLibrary();
hello.printGreeting();
}
在前面的代碼中,
await 關鍵字會暫停執行,直到庫加載完畢。
有關 async 和 await 的更多信息,
請參見 異步支持 。
您可以多次在庫上調用 loadLibrary() 而不出現問題。
庫只加載一次。
使用延遲加載時,請記住以下幾點:
- 延遲庫的常量在導入文件中不是常量。
請記住,這些常量在延遲庫加載之前不存在。 - 您不能在導入文件中使用延遲庫中的類型。
相反,請考慮將接口類型移動到由延遲庫和導入文件同時導入的庫。 - Dart 會隱式地將
loadLibrary()插入到您使用deferred as 命名空間定義的命名空間中。
loadLibrary()函數返回一個Future。
library 指令
要指定庫級 文檔註釋 或 元數據註釋 ,
請將它們附加到文件開頭的 library 聲明。
/// 一個非常棒的測試庫。
@TestOn('browser')
library;
實現庫
有關如何實現包的建議,請參閲
創建包 ,其中包括:
- 如何組織庫源代碼。
- 如何使用
export指令。 - 何時使用
part指令。 - 如何使用條件導入和導出來實現支持多個平台的庫。
來源:Dart 中文開發文檔