如何定義一個變數呢?在 Dart 中,我們可以使用 var 關鍵字來作為變數的類型。
若未指定數值,此時變數為 null。
var item;
if(item == null){
print('item is null');
}
// item is null
定義變數時,利用等號指定數值給該變數,Dart 編譯器會根據等號後面的數值推斷類型 。
var item = 'This is a String';
print(item.runtimeType);
// String
在定義變數時,若已指定數值,那麼該變數已經存有類型,之後再指定其他類型是不允許的,IDE 會在編譯時出現警告。
如下方的範例:
變數 item 指定一個 String 字串,編譯器 item 推斷類型為 String,若另指定一個整數給變數 item ,則是不被允許的。
除了使用 var 定義變數,我們也可以明確的宣告變數類型。
String item = 'This is a String';
同樣的,如果定義變數時同時宣告類型,這個情況之下,也無法再指定其他類型的數值給這個變數。
String name = 'Andy';
name = 5; // Compilation-Error
定義變數的時候,也可以將變數定義 dynamic 或是 Object。其中,dynamic 是關鍵字,Object 是類型。
當變數使用關鍵字 dynamic 及 類型 Object 時,表示可以指定任何類型的數值給該變數。
如下面範例:
dynamic dynamicItem;
dynamicItem = 1; // OK
dynamicItem = 'Dynamic Item'; //OK
Object objectItem;
objectItem = 2; // OK
objectItem = 'Object Item';
dynamic dynamicItem = 'Dynamic Item';
print(dynamicItem.length); // 12
Object objectItem = 'Object Item';
print(objectItem.length); // Compilation-Error
關鍵字 dynamic 會用在泛型的應用上,我們在之後的文章會再多做介紹。
前面所介紹的關鍵字所定義的變數,都是可以被修改的,如果需要定義一個不可變的變數呢?
使用 final 以及 const 關鍵字,可以將變數定義成不可變的。
用 final 宣告變數,表示這個變數在指定數值之後,就不可以改變其值。
如同 var ,final 同樣也有類型推斷的能力,如下例:
final finalItem = 'final item';
finalItem = 'New final item'; //Compilation-error
也可以在關鍵字 final 後面加上類型,如此在等號後面的值就必須為該類型才允許存入。
final String finalString = 'final string';
final String finalString2 = 1; //Compilation-error
用關鍵字 final 宣告變數,必須在宣告時就指定數值,否則 IDE 將會編譯錯誤。
final emptyItem; //Compilation-error
const 是 compile-time 常數,意指這個數值是恆久不變的。
const maxValue = 1000;
如果需要在 class 裡面定義 const ,需加上 static,否則將會 compilation-error。
class TestConst{
static const VALUE = 1000;
}
const 除了可以定義常數之外,還可以建立常數。
var foo = const[];
final bar = const[];
const baz = []; //等於 const[];
foo[0] = 1; // Cannot modify an unmodifiable list
foo = [1, 2]; // OK
bar[0] = 1; // Cannot modify an unmodifiable list
bar = [1, 2] //Compilation-error
目前 Dart 在建立變數的時候,若沒有指定值,其預設值是 null,在使用上的時候需要小心。
類型推斷可以減少多餘的型態定義,但是在定義變數時帶入型態,可以避免設定初始值時設定錯誤。
var, final 都是屬於 run time 產生的數值,如果需要一個編譯期的常數,可以使用 const 關鍵字來定義變數。
如果在類別中定義 const 變數,則必須加上 static 關鍵字,才不會發生錯誤。