1.特殊運(yùn)算符
- ??=
//原來變量有值時(shí)??=不執(zhí)行,當(dāng)原來變量為null時(shí)將值賦值給這個(gè)變量
var name = null;
name ??= "lisi";
print(name); //輸出結(jié)果lisi
var name = "a";
name ??= "lisi";
print(name); //輸出結(jié)果a
- ??
// ??前面有值就使用??前面的值,??前面為null則使用??后面的值
var name = "a";
var temp = name ?? "lilei";
print(temp); //輸出結(jié)果a
var name = null;
var temp = name ?? "lilei";
print(temp); //輸出結(jié)果lilei
- ..(級聯(lián)運(yùn)算符)靶橱,類似鏈?zhǔn)秸{(diào)用
void main(List<String> args) {
var dog = Dog()
..name = "xiaohuang"
..eat()
..run();
}
class Dog {
String? name;
void eat() {}
void run() {}
}
2.final和const的區(qū)別
const必須賦值,編譯期間能確定的常量值
final可以通過函數(shù)獲取,可以運(yùn)行期間來確定的值
例子:
const data = DateTime.now() //錯誤,編譯期間無法確定
final data = DateTime.now() //正確
3.集合類型
- 列表List
var list = ["123", "321", "11"];
- 集合Set
var set = {"123", "321", "11"};
- 映射Map
var map = {"name": "zhangsan", "age": 20};
4.函數(shù)參數(shù)
函數(shù)的參數(shù)可以分成兩類: 必須參數(shù)和可選參數(shù),前面使用的參數(shù)都是必選參數(shù)
Dart的函數(shù)不支持函數(shù)重載
- 必傳參數(shù)
// 必選參數(shù): 必須傳 void say1(String name) { print(name); } say1("lisi");
- 位置可選參數(shù)
// 位置可以選參數(shù),[]必須按照參數(shù)順序傳參,無需參數(shù)名 void say2(String name, [int age = 0, double height = 0]) { print(name); } say2("wangwu"); say2("zhangsan", 18); say2("zhangsan", 18, 1.88);
- 命名可選參數(shù)
// 命名可選參數(shù),{}內(nèi)參數(shù)無順序要求,但是必須帶上參數(shù)名 void say3(String name, {int age = 0, double height = 0}) { print(name); } say3("maliu"); say3("maliu", age: 18); say3("maliu", height: 1.88); say3("maliu", age: 18, height: 1.88);
5.構(gòu)造方法
-
命名構(gòu)造方法
因?yàn)镈art不支持函數(shù)的重載,所以我們沒辦法創(chuàng)建相同名稱的構(gòu)造方法,這時(shí)我們就需要使用命名構(gòu)造方法
在實(shí)際開發(fā)中我們也可以使用命名構(gòu)造函數(shù)來提供更加方便的創(chuàng)建對象方法:void main(List<String> args) { var a1 = Animal(); var a2 = Animal.withArgments("dog", 2); } class Animal { String? name; int? age; Animal() { name = ""; age = 0; } Animal.withArgments(String name, int age) { this.name = name; this.age = age; } }
Animal.fromMap(Map<String, Object> map) { this.name = map['name'] as String; this.age = map['age'] as int; } var a3 = Animal.fromMap({"name": "cat", "age": 10}); print("name is ${a3.name} age is ${a3.age}"); //輸出結(jié)果name is cat age is 10
-
常量構(gòu)造方法
在某些特定場景需要我們傳入相同參數(shù)返回的對象是同一個(gè),這時(shí)可以使用常量構(gòu)造方法,常量構(gòu)造方法的類中所有屬性必須用final修飾,創(chuàng)建對象使用const關(guān)鍵字而不是new關(guān)鍵字void main(List<String> args) { var dog1 = Dog('xiaohua'); var dog2 = Dog('xiaohua'); print(identical(dog1, dog2)); //false var cat1 = const Cat("xiaohuang"); var cat2 = const Cat("xiaohuang"); var cat3 = const Cat("xiaohuang2"); print(identical(cat1, cat2)); //true print(identical(cat1, cat3)); //false } class Dog { String name; Dog(this.name); } class Cat { final String name; const Cat(this.name); }
-
工廠構(gòu)造方法
如果一個(gè)構(gòu)造函數(shù)并不總是返回一個(gè)新的對象陌知,則使用 factory 來定義 這個(gè)構(gòu)造函數(shù)。
如例子中創(chuàng)建2個(gè)名字為‘小黃’的Dog對象工廠返回的是同一個(gè)對象并沒有創(chuàng)建新的對象踊东。這里與其他構(gòu)造方法的不同點(diǎn):工廠方法必須有返回值,而構(gòu)造方法是不能有返回值的.
void main(List<String> args) { var dog1 = Dog("小黃"); var dog2 = Dog("小黃"); var dog3 = Dog("小藍(lán)"); print(identical(dog1, dog2)); //true print(identical(dog2, dog3)); //false } class Dog { String name; static final Map<String, Dog> _cache = <String, Dog>{}; factory Dog(String name) { if (_cache.containsKey(name)) { return _cache[name] as Dog; } else { final dog = Dog._internal(name); _cache[name] = dog; return dog; } } Dog._internal(this.name); }
-
重定向構(gòu)造方法
一個(gè)構(gòu)造函數(shù)調(diào)用另外一個(gè)構(gòu)造函數(shù)(冒號后面使用this調(diào)用其他構(gòu)造函數(shù))void main(List<String> args) { var dog = Dog("xiaohuang", 2); var dog1 = Dog.fromMap({"name": "xiaoghuang2", "age": 12}); } class Dog { String name; int age; Dog(this.name, this.age); Dog.fromName(String name) : this(name, 0); Dog.fromMap(Map map) : this.fromName(map["name"]); }
6.setter和getter
void main(List<String> args) {
var dog = Dog("小黃");
dog.setName = "小黑";
print(dog.name);
dog.name = "小白";
print(dog.getName);
}
class Dog {
String name;
String get getName {
return name;
}
set setName(String name) {
this.name = name;
}
Dog(this.name);
}