Flutter123 Dart的基本介紹-變數宣告

Kayle
4 min readMay 23, 2020

這個 Online 的 Compile 很好用 : https://dartpad.dev/

剛開始寫 Dart 時,覺得這跟 Java 真像啊,寫起來真是沒有太大的違和感,這篇就來聊聊 Dart 語法的一些基本介紹。

Var

void main() {
var a = "1";
var b = 2;
var c = 3.14159;
print(1); // 印出 "1"
print(2); // 印出 2
print(3); // 印出 3.14159
// runtimeType 是用來判斷變數的資料型態用的
print(a.runtimeType); // 印出 String
print(b.runtimeType); // 印出 int
print(c.runtimeType); // 印出 double
}

在 Dart 中,宣告的方法是 Var ,也不用像是 Java 一樣要先下資料型態 (String a = “a”, Int b = 2;) 的做法,會自動判別等式後面的資料型態自動判斷 ,不過當你使用了 Var 之後,就不能再賦予該變數其他型態了

void main() {
var a = "1";
a = 1;
print(a)
}

以上這段 Code 會出現以下的 Error: A value of type ‘int’ can’t be assigned to a variable of type ‘String’.

不過 Var 也有另外一種用法, 一開始不定義資料型態,就可以隨意變更型態

void main(){
var a ;
a = 1;
print(a); // 印出 1
a = "test";
print(a); // 印出 "test"
a = [1,2,3,4,5];
print(a); // 印出 [1,2,3,4,5]
}

常數

常數就是宣告了一個變數後,不會在變更的變數 (也無法再變更)

void main() {
const a = 1; // 宣告了一個常數,名稱是a,值是1
print(a); // 印出 1
a = 2 ; // 試著將 a 賦予 2這個值
print(a); // Error: Can't assign to the const variable 'a'.
}

const 也可以用在陣列的宣告

void main(){
List<String> list = ["a","b","c"];
print(list); // [a, b, c]
list.add("d");
print(list); // [a, b, c, d]
List<String> constList = const["a","b","c"];
print(constList); // [a, b, c]
constList.add("d");
print(constList); // Uncaught Error: Unsupported operation:
// add. 無法新增欄位
}

Object

這種宣告可以任意的變更裡面的值

void main(){
Object a = 1;
print(a); // 1
print(a.runtimeType); // int
a = "b";
print(a); // "b"
print(a.runtimeType); // String
}

可以透過 runtimType 發現,當更改了內部的資料的型態後,型態會自動轉變。

Dynamic

跟 Object 一樣,可以任意的變更變數的型態

void main(){
dynamic a = 1;
print(a); // 1
print(a.runtimeType); // int
a = "b";
print(a); // "b"
print(a.runtimeType); // String
}

Object VS Dynamic

既然,這兩者都可以隨意變更資料型態,那幹嘛還要有兩種?
當然是因為還是有不一樣的地方囉
Object : 動態任意類型,編譯階段檢查類型
Dynamic : 動態任意類型,編譯階段不檢查類型
欸欸,這樣說明誰聽得懂啊(其實只有筆者自己聽不懂想求認同吧)
來個範例

兩種宣告方式最後用不存在的method做測試

從圖片中看得出來差異,Object 在編譯階段時就會做檢查,而 Dynamic 則不會檢查。
那什麼時候要用 Object ,什麼時候要用 Dynamic呢?
對不起,這時候筆者還分不清楚XDDD
之後摸熟之後會再回來完成後面的說明的 <(_ _)>

--

--