玩轉 Flutter 之 Dart-變量

本文不適合小白與非 IT 相關人員閱讀。

玩轉 Flutter 之 Dart-變量

相關知識點:

  1. var
  2. dynamic
  3. final
  4. const

之前我們知道一個變量可以指定類型聲明,比如:

String s = 's1';
int i = 2;
double f = 2.2;
// ... 等等

其實願意的話,完全可以使用 var 來處理,讓編譯器自動推斷:

var s = 's1'; // type String
var i = 2; // type int
double f = 2.2; // type double
// ... 等等

沒錯,var 這樣用就夠了。


dynamic 聲明變量,並且類型可變。

無論是 var 還是 int 等類型聲明的變量,再次賦值其他類型會報錯,如下:

var s = 's1';
s = 1;
玩轉 Flutter 之 Dart-變量

但是如果使用 dynamic 申明的變量,則可以進行此操作,如下:

dynamic s = 's1';
print(s); // s1
s = 1;
print(s); // 1

這就跟 JS 很像了,但是呢,個人不推薦過於依賴這個東西,沒錯就是說我們這幫動態語言患者。但是,如果你在某個函數的返回值看到這個類型,知道是怎麼回事就行啦。


final 賦值一次就定下來,不可再變動。

其實字面意思也很明確,最終嘛。

玩轉 Flutter 之 Dart-變量

玩轉 Flutter 之 Dart-變量

嘗試修改則報錯,原因是 final 申明的變量,對象內部的 setter 不存在(或屏蔽),所以無法使用賦值。


const 隱式的 final,不單單可以約束變量,也可以約束變量的值。

玩轉 Flutter 之 Dart-變量

玩轉 Flutter 之 Dart-變量

很明顯,無法修改。

這與 final 差不多(細微差別會在 class 那裡存在,下面提到),但是 const 還可以修飾值。

比如你想弄個固定的 List(或 map 或其他類型等),明確後續不再改變它,那麼 const 就有用了,比如:

玩轉 Flutter 之 Dart-變量

如果你按照 final 去嘗試固定一個數組,那麼不好意思,它是可以改變的,結果當然是 [1]。

那麼你可以這樣嘗試:

玩轉 Flutter 之 Dart-變量

這樣,你就無法修改了,報錯信息如下:

玩轉 Flutter 之 Dart-變量

上面使用 var 也可以,不過 f 的值確實不可變,但是 f 本身可以賦值為別的值。

那麼,Dart 對於 final 又 const 的方案提供了簡寫:

玩轉 Flutter 之 Dart-變量

這個就相當於:

玩轉 Flutter 之 Dart-變量

當然了,上面的簡寫與非簡寫都會報錯。

腫麼樣,有沒有懵逼?有的話,多看兩遍……一開始我也懵逼了好久。


提一下 final 與 const 在 class 中的一個小區別:

玩轉 Flutter 之 Dart-變量

裡面的 Person 就是類似 constructor 的構造函數,{} 是簡寫賦值實例變量,這些後面文章會提到,這裡有點印象即可。

上述寫法是可以的,而使用 const 則不行:

玩轉 Flutter 之 Dart-變量

這裡的區別是 final 為運行時常量,而 const 為編譯時常量。這裡可以理解 final 只是寫在那裡,初始賦值在構造函數里,所以不報錯。而 const 不行,是因為 const 在寫出來時候就要知道具體的值是多少(比如 const date = new Date();這種都會報錯,因為時間是在運行時候確定的),而上圖的玩法就是構造函數執行才知道值,所以不行。

至於測試過程中,裸寫 final 必須有賦值,而 class 裡面可以等到構造時候賦值,個人目前認為就是寫法規範所允許(方便實例變量屬性初始化),按道理來說是需要 final x = y; 這樣才行,但是 class 這裡小夥伴注意下就好,允許在構造函數里面完成初始化賦值。


下篇:流程控制


分享到:


相關文章: