博客 / 詳情

返回

Dart 語法基礎

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 庫與導入

importlibrary 指令可以幫助您創建模塊化且可共享的代碼庫。庫不僅提供 API,而且還是隱私單元:以下劃線 (_) 開頭的標識符僅在庫內可見。_每個 Dart 文件(及其部分)都是一個 庫_,即使它不使用 library 指令。

庫可以使用 包 進行分發。

注意
要了解為什麼 Dart 使用下劃線而不是 publicprivate 等訪問修飾符關鍵字,請參閲
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 關鍵字會暫停執行,直到庫加載完畢。

有關 asyncawait 的更多信息,

請參見 異步支持 。

您可以多次在庫上調用 loadLibrary() 而不出現問題。

庫只加載一次。

使用延遲加載時,請記住以下幾點:

  • 延遲庫的常量在導入文件中不是常量。
    請記住,這些常量在延遲庫加載之前不存在。
  • 您不能在導入文件中使用延遲庫中的類型。
    相反,請考慮將接口類型移動到由延遲庫和導入文件同時導入的庫。
  • Dart 會隱式地將 loadLibrary() 插入到您使用 deferred as 命名空間 定義的命名空間中。
    loadLibrary() 函數返回一個 Future

library 指令

要指定庫級 文檔註釋 或 元數據註釋 ,

請將它們附加到文件開頭的 library 聲明。

/// 一個非常棒的測試庫。
@TestOn('browser')
library;

實現庫

有關如何實現包的建議,請參閲

創建包 ,其中包括:

  • 如何組織庫源代碼。
  • 如何使用 export 指令。
  • 何時使用 part 指令。
  • 如何使用條件導入和導出來實現支持多個平台的庫。

來源:Dart 中文開發文檔

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.