天天看點

Dart語言之旅

本頁向您展示了如何使用每個主要的Dart特性,從變量和運算符到類和庫,假定您已經知道如何用另一種語言程式設計。

要了解有關Dart核心庫的更多資訊,請參閱 Dart Library之旅。無論何時您想了解有關語言功能的更多詳細資訊,請參閱 Dart語言規範。

一個基本的dart程式

以下代碼使用了Dart最基本的許多功能:

// 定義一個函數.
printInteger(int aNumber) {
  print('The number is $aNumber.'); // 列印到工作台
}

//這是應用程式開始執行的地方.
main() {
  var number = 42; // 聲明并初始化一個變量
  printInteger(number); // 調用一個函數.
}
           

以下是适用于所有(或幾乎所有)Dart應用程式的寫法:

// 單行注釋
//此外dart還支援多行注釋和文檔注釋,詳情見後面

int  //int類型,其他一些内置類型是String,List bool

42 //數字,數字是一種編譯時常量

print() //一種很友善的列印方法

'......' or"......" //這兩種都是表示字元串

$variableName (or ${expression})
//字元串插值:在字元串文字中包含一個變量或表達式的字元串。有關更多資訊,請參閱字元串。
main()  //一個應用程式執行開始的特殊的、必須的函數,詳情檢視main函數
var //聲明變量但不指定類型
           

重要概念

當你了解Dart語言時,要牢記這些事實和概念:

  • 你可以放在變量中的所有東西都是一個對象,每個對象都是一個類的執行個體。即使是數字,功能, null也是對象。所有對象都從Object類繼承。
  • 雖然Dart是強類型的,但類型注釋是可選的,因為Dart可以推斷類型。在上面的代碼中,number 被推斷為是類型的int。當你想明确地說沒有類型時, 使用特殊類型dynamic。
  • Dart支援泛型類型,如List<int>(整數清單)或List<dynamic>(任何類型的對象清單)。
  • Dart支援頂層函數(如main()),以及與類或對象綁定的函數(分别為靜态方法和執行個體方法)。你也可以在函數中建立函數(嵌套函數或局部函數)。
  • 同樣,Dart支援頂級變量以及綁定到類或對象(靜态變量和執行個體變量)的變量。執行個體變量有時稱為字段或屬性。
  • 與Java,dart不具備關鍵字public,protected和private。如果辨別符以下劃線(_)開頭,則它的庫是私有的。有關詳細資訊,請參閱 庫和可見性。
  • 辨別符可以以字母或下劃線(_)開頭,然後是這些字元和數字的任意組合。
  • 有時候,重要的是某件事是一種表達式還是一種 聲明,是以這兩個詞的确切含義很有幫助。
  • Dart工具可以報告兩種問題:warnings 和errors。警告隻是表明您的代碼可能無法正常工作,但它們不會阻止您的程式執行。錯誤可以是編譯時或運作時。編譯時錯誤導緻代碼無法執行; 運作時錯誤導緻 代碼執行時引發異常。

關鍵詞

下表列出了Dart語言特别處理的關鍵詞。

abstract do import super
abstract1 do import 1 super
as 1 dynamic 1 in switch
assert else interface 1 sync* 2
async 2 enum is this
async* 2 export 1 library 1 throw
await 2 external 1 mixin 1 true
break extends new try
case factory 1 null typedef 1
catch false operator 1 var
class final part 1 void
const finally rethrow while
continue for return with
covariant 1 get 1 set 1 yield 2
default if static 1 yield* 2
deferred 1 implements 1

1帶上标1的單詞是内置辨別符。

避免使用内置辨別符作為辨別符。

如果您嘗試為類或類型名稱使用内置辨別符,則會發生編譯時錯誤。

2帶上标2的單詞是較新的,與Dart 1.0版本釋出後添加的異步支援相關的有限保留字。

您不能使用async,await或yield作為用async,async 或sync 标記的任何函數體中的辨別符。

有關更多資訊,請參見異步支援

**關鍵字表中的所有其他字都是保留字。

您不能使用保留字作為辨別符**

變量

以下是建立變量并初始化變量的示例:

var name ='Bob';
           

變量存儲的是引用,命名為name的變量存儲的是 值為"Bob"的字元創的一個引用

name變量的類型被推斷為String,但您可以通過指定它來更改該類型。

如果對象不限于單一類型,請遵循設計指南指定對象或動态類型

dynamic name ='Bob';
           

另一種選擇是顯式聲明将被推斷的類型

String name = 'Bob';
           

預設值

未初始化的變量的初始值為null。即使數字類型的變量最初為null,因為數字 - 和Dart中的其他所有資料一樣 - 都是對象。

int lineCount;
assert(lineCount == null);
           
注意:assert()産品代碼中 的調用被忽略。在開發過程中, 除非條件為真,否則會引發異常。有關詳細資訊,請參閱Assert。assert(condition)

Final和const

如果你從不打算改變一個變量,使用final或者const,而不是var或者其他類型。最終的變量隻能設定一次; 一個const變量是一個編譯時常量。(Const變量隐式final 。)final的頂層或者class變量在它第一次被使用時被初始化。

注意: 執行個體變量可以final但不是const。

以下是建立和設定最終變量的示例:

final name = 'Bob'; // 沒有類型聲明
// name = 'Alice';  // 取消注釋會導緻UC哦嗚
final String nickname = 'Bobby';
           

将const用于想要成為編譯時常量的變量。

如果const變量處于類級别,則将其标記為靜态常量。

在聲明該變量的位置,将該值設定為編譯時常量,例如數字或字元串文字,常量變量或常數上算術運算的結果:

const bar = 1000000; // 壓力機關(dynes/cm2)
const double atm = 1.01325 * bar; // 标準大氣壓
           

該const關鍵字不隻是聲明常數變量。您也可以使用它來建立常量值,以及聲明建立常量值的構造函數。任何變量都可以有一個常量值。

// Note: [] 建立一個空的list
// const [] 建立一個空的, 一成不變的list (簡寫為EIL).
var foo = const []; // foo 目前是一個 EIL(empty immutabe list).
final bar = const []; // bar 将永遠是 EIL.
const baz = const []; // baz 是一個編譯時常量 EIL.

// You can change the value of a non-final, non-const variable,
// even if it used to have a const value.
foo = [];

// You can't change the value of a final or const variable.
// bar = []; // Unhandled exception.
// baz = []; // Unhandled exception.