How to define Dart variables


How to define Dart variables

在 Dart 中我們如何定義一個變數呢?我們可以直接宣告一個型別也可以使用 var 或是 dynamic 之類的關鍵字,這邊簡單介紹各種宣告的方式


data type

我們可以在變數名稱前面直接加上型態名稱就可以宣告

int str = "HELLO";
print(str);

命名規則上有幾點要注意

1. 官方推薦使用駝峰式命名(lower came case)
2. 開頭不可為數字
3. 命名中不能包含特殊符號除了 _$
4. 大小寫有區分
5. 不可與保留字重複

var

var 提供型別自動推斷型別的宣告,var 在第一次指定初始值之後便可以自動推斷型別且之後不可指定其他型別的值

var str = "HELLO";
print(str.runtimeType); // String
str = 123; // [compile error] A value of type 'int' can't be assigned to a variable of type 'String'. 

我發現在撰寫時如果 var 一開始不給值那特性就會變成跟 dynamic 一樣,這不知道是不是 Dart 的 bug 還是故意而為之的特性

var value;
print(value.runtimeType); // Null
value = 123;
print(value.runtimeType); // int
value = "str";
print(value.runtimeType); // String

dynamic

dynamic 與 var 不同的是 dynamic 可以任意改變型別

dynamic number = 1;
print(number.runtimeType); // int
number = "str";
print(number.runtimeType); // String

Object

Objcet 是所有物件的父類,如果把 Object 當作型態來宣告的話效果與 dynamic 類似但是就會無法使用像是 String 的 length 之類的方法,因為 Object 沒有定義這個方法,如果要使用那需要轉型

Object obj = "str";
print((obj as String).length);
print(obj.length); // [compile error] The getter 'length' isn't defined for the type 'Object'

Null safety

Dart 在 2021/03/03 發佈了 Dart 2.12 在此版本中最重要的就是 Null safety,簡單一句話結束 Null safety 就是在宣告時就必須告知變數是否可為 null

在使用 Null safety 之前我們宣告的變數都可以為 null,但使用 Null safety 之後變數預設都為不可為 null

String str;
print(str); // [compile error] The non-nullable local variable 'str' must be assigned before it can be used.

要讓變數可為 null 很簡單,在宣告時型別加上問號就可宣告為可 null 的型別

String? str;
print(str); // null

Late variables

如果我們使用的情境是我們在宣告的當下無法給出一個定值必須要等等才會給值,此時我們可以使用 late 關鍵字

class Member{
  late String name;
  void init(){
    name = "init";
  }
}

注:Null safetyLate variables 都是在 Dart 2.12 and Flutter 2 之後才有的新特性


final and const

如果我們需要常數,就是一個不能被改變值的變數則可以使用 final or const

final 與 const 時常搞混,兩者都是宣告時就必須指定 value 之後就不能修改否則會有 compile error,那這個兩個差異可以這麼理解 final 在 run time 時就指定 valueconst 在 compile time 時指定 value

String getDateString(){
  DateTime time = DateTime.now();
  return time.toIso8601String();
}
main(){
  final finalValue = getDateString();
  const constValue = "2021-06-17T13:07:03.053524";
  const constValue2 = getDateString(); // [compile error] Const variables must be initialized with a constant value.
}

final 與 const 在使用上也可以加上型別,但是要注意不能與 var 同時使用

final finalValue1 = "finalValue1";
final String finalValue2 = "finalValue2";
final var finalValue3 = "finalValue3"; // [compile error] Members can't be declared to be both 'var' and 'final'.

const constValue1 = "constValue1";
const String constValue2 = "constValue2";
const var constValue3 = "constValue3"; // [compile error] Members can't be declared to be both 'var' and 'const'.

static

static 可以使用在 class 內的 variable 或是 function 使其變成全域變數或是全域的function

class Log{
  static const TAG = "TAG";
  static e(String tag, String str){
    print("$tag, $str");
  }
}
main(){
  Log.e(Log.TAG, "message");
}

說到這裡也總算把所有宣告的方法都粗淺的看過一遍了,謝謝各位收看。


WRITTEN BY
Aki

熱愛寫code的開發者,專注於 Android 手機 Native App 開發,對於 IOS 也有涉略。閒暇之餘也學習 JavaScript 等前端框架