Dart語(yǔ)言簡(jiǎn)介
對(duì)于Dart這一門語(yǔ)言,百度百科是這么解釋的:Dart是谷歌開發(fā)的計(jì)算機(jī)編程語(yǔ)言,它被應(yīng)用于web苔咪、服務(wù)器、移動(dòng)應(yīng)用和物聯(lián)網(wǎng)等領(lǐng)域的開發(fā)柳骄,它是面向?qū)ο笸派汀㈩惗x、單繼承的語(yǔ)言耐薯,當(dāng)然啦~ 樓主來(lái)了解這個(gè)語(yǔ)言就是為了了解用Dart來(lái)開發(fā)的Flutter應(yīng)用舔清。
Dart SDK 和 IDE的安裝
要學(xué)某種語(yǔ)言,首先當(dāng)然是SDK 和 IDE的安裝
Dart SDK的安裝可以參考官網(wǎng)的命令來(lái)安裝:Dart官網(wǎng)
??:如果在安裝的過程中出錯(cuò)曲初,可以看看https://blog.csdn.net/qq_40028324/article/details/105692357這篇文章能否幫你解決問題(畢竟樓主是依靠這篇文章來(lái)解決問題的 親測(cè)有效~)
關(guān)于Dart的開發(fā)工具選擇比較多体谒,有IDEA、VS Code 等 樓主這里使用的是IDEA 每個(gè)開發(fā)工具的具體安裝參考官網(wǎng)即可臼婆,由于樓主使用的是IDEA抒痒,我這里就拿IDEA來(lái)舉例。
安裝IDEA之后颁褂,打開IDEA故响,搜索Dart插件安裝,到此 我們的Dart整個(gè)開發(fā)環(huán)境就搭建好了颁独,接著就要進(jìn)入正題了~
Hello World
// main 方法是程序入口
void main() {
print("Hello World"); // 輸出:Hello World
}
一彩届、Dart中的數(shù)據(jù)類型
1、變量和常量
變量:var
常量:const ??:使用const聲明的必須是編譯期變量
關(guān)鍵字final:聲明只能賦值一次的變量
??:
void main() {
var a = 10;
final b = 20;
const c = 30;
}
2誓酒、數(shù)值型:num
num 只有int 和 double兩種類型
常用的操作:+ - * / % ~/
常用屬性:isNaN(是否不是數(shù)字)樟蠕,isEven,isOdd......
??:
void main() {
num a = 12.5;
int b = 20;
print(b ~/a); // 1 ~/表示除之后對(duì)結(jié)果取整
print(b/a); // 1.6
print((0.0/0.0).isNaN); // true
print(b.isEven);// 是否是偶數(shù) true
print(b.isOdd);// 是否是奇數(shù) false
}
3、字符串:String
""
和 ''
都可以創(chuàng)建字符串
"""
和 '''
創(chuàng)建多行的字符串
r
創(chuàng)建一個(gè)原始的字符串
常用操作:+ * == []
常用屬性:length寨辩、isEmpty寂汇、split()......
插值表達(dá)式:${expression}
??:
void main () {
String str0 = "Hello"; // ''
String str1 = '''Hello
World!!!''';
String str2 = r'Hello \n Dart';
String str3 = 'Hello';
String str4 = str3 + ' World';
print(str0);
print(str1);
print(str2); // Hello \n Dart
print(str4); // Hello World
print(str3 * 2); // HelloHello
print(str3 == str4); // false
print(str3[4]); // o
int a = 1;
int b = 2;
print("a + b = ${a+b}"); // a + b = 3
print(str4.substring(0,3)); // Hel
print(str4.split(' '));// [Hello, World]
}
4、布爾類型:bool
true捣染、false
5骄瓣、列表(數(shù)組):List
構(gòu)造創(chuàng)建:var list = new List();
??:
void main () {
var list = [1,2,3,"Dart",false]; // list里面的元素可以是多種類型 不要求是同一種類型
print(list); // [1,2,3,"Dart",false]
var list1 = const [1,2,3];
// list1[1] = 6; // 運(yùn)行會(huì)報(bào)異常
list.insert(0, 999);
print(list); // [999,1,2,3,"Dart",false]
// 遍歷List
list.forEach((element) {
print(element);
});
print(list.indexOf(6)); // 如果沒有找到對(duì)應(yīng)的元素 返回結(jié)果是 -1
var list2 = new List();
}
6、鍵值對(duì):Map
創(chuàng)建Map:var language = {'first':''Dart,'second':'Java'};
創(chuàng)建不可變的Map:var language = const {'first':''Dart,'second':'Java'};
構(gòu)造創(chuàng)建:var language = new Map();
常用的屬性耍攘、操作:length榕栏、keys、values蕾各、forEach(遍歷)扒磁、containsKey(是否包含某個(gè)key)......
asMap():把list轉(zhuǎn)成map
??:
void main() {
var map0 = {"first":"Dart",1:true, true:666,"OC":null};// key 和 value 都可以是任意類型
print(map0["OC"]);// null
var map = {"first":"Dart","second":"Swift","third":"Java"};
map.forEach(func);
var list = ["Dart","Swift","Java"];
print(list.asMap()); // {0: Dart, 1: Swift, 2: Java}
}
void func(key,value) {
print("key = $key, value = $value");
}
7、dynamic(動(dòng)態(tài)型)
??:
void main() {
var a;
a = 10;
a = "Dart";
dynamic b = 10; // dynamic 表示是動(dòng)態(tài)類型 如果寫int b = 10; b = "Dart"是會(huì)報(bào)錯(cuò)的 因?yàn)閕nt b = 10 默認(rèn)b就是int類型
b = "Dart";
}
二式曲、運(yùn)算符
1妨托、算術(shù)運(yùn)算符
常用的操作:+、-吝羞、*兰伤、/、~/钧排、%
遞增遞減:++var敦腔、var++、--var恨溜、var--
??:
void main () {
int a = 1;
print(a + 1); // 2
print(a++); // 1
print(a); // 2
print(--a);// 1
}
2符衔、關(guān)系運(yùn)算符
運(yùn)算符:==、!=糟袁、>判族、<、>=项戴、<=
3形帮、邏輯運(yùn)算符
運(yùn)算符:!肯尺、&&沃缘、||
4、賦值運(yùn)算符
基礎(chǔ)運(yùn)算符:=则吟、??=
復(fù)合運(yùn)算符:+=槐臀、 -= 、/= 氓仲、*= 水慨、%= 得糜、~/=
??:
void main () {
int a = 10;
int b;
// ??= 表示如果有值就是原來(lái)的值 如果沒有值就是賦的值
b ??= 20;
print(b); // 20
int c = 10;
c ??= 20;
print(c); // 10
print(a ~/= 5); // 2
}
5、條件表達(dá)式
三目運(yùn)算符:?:
??運(yùn)算符:expre1 ?? expre2 表示如果第一個(gè)表達(dá)式為nil 則取第二個(gè)表達(dá)式
??:
void main () {
String a;
String b = "Dart";
String c = a ?? b;
print(c); // Dart
}
三晰洒、控制語(yǔ)句
1朝抖、if 、if else
2谍珊、for 循環(huán)治宣、for...in 語(yǔ)句
??:
void main () {
var list = [1,2,3,4,5,6];
for(int index = 0; index < list.length; index++) {
// print(list[index]);
}
for(var item in list) {
print(item);
}
}
3、while砌滞、do...while
??:
void main() {
int count = 0;
while(count < 5) {
print(count++); // 0 1 2 3 4
}
// count = 5
do {
print(count --);
}while(count > 0 && count < 5); // 5 4 3 2 1
}
4侮邀、break、continue
break:終止循環(huán)
continue:跳出當(dāng)前循環(huán)
??:
void main () {
var list1 = [1,2,3];
var list2 = [4,5,6];
for(var item1 in list1) {
for(var item2 in list2) {
if(item2 == 5) {
// break; // 4 4 4
continue; // 46 46 46
}
print(item2);
}
}
}
5贝润、switch...case語(yǔ)句
5.1 比較類型:num绊茧、String、編譯期常量打掘、對(duì)象华畏、枚舉
5.2 非空case必須有一個(gè)break
5.3 使用default來(lái)處理默認(rèn)情況
5.4 可以用continue來(lái)加一個(gè)跳轉(zhuǎn)標(biāo)簽(其他語(yǔ)言沒有的)
??:
void main () {
String language = "Python";
switch(language) {
Test: // 標(biāo)簽隨便定義的
case "Java":
print("Java");
break;
case "Dart":
print("Dart");
break;
case "Python":
print("Python");
continue Test;
// break;
default:
print("None");
}
// 輸出結(jié)果是:Python、Java
}
四、方法
1、方法的定義
返回類型 方法名 (參數(shù)1,參數(shù)2...){
方法體...
return 返回值
}
2、方法特性
2.1 方法也是對(duì)象 并且具有具體的類型Function
2.2 方法的返回值絮供、參數(shù)類型都可以省略
2.3 方法都有返回值 如果沒有返回值默認(rèn)是null
??:
void main (List args) {
printPerson("Sunny", 18); // 輸出:name = Sunny,age = 18
}
printPerson (name, age) {
print("name = $name,age = $age");
}
2.4 箭頭語(yǔ)法: => expre 是return{expre}的縮寫 ??:只適用于一個(gè)表達(dá)式
??:
void main (List args) {
print(printPerson("Sunny", 18)); // 輸出:name = Sunny盯仪,age = 18
}
printPerson (name, age) => "name = $name,age = $age";
3忍饰、可選參數(shù)
3.1可選命名參數(shù):{params1,params2耐版,params3...}
3.2 可選位置參數(shù):[params1祠够,params2,params3...]
??:
void main () {
printPerson("Sunny",age: 20);
printPerson2("Sunshine",20,"Male");
}
// 可選命名參數(shù){}
printPerson(String name,{int age, String gender}) {
print("name = $name, age = $age, gender = $gender"); // 打印結(jié)果:name = Sunny, age = 20, gender = null
}
// 位置可選參數(shù)[]
printPerson2(String name,[int age, String gender]) {
print("name = $name, age = $age, gender = $gender"); // 打印結(jié)果:name = Sunny, age = 20, gender = Male
}
??:如果存在可選參數(shù) 可選參數(shù)必須要在必選參數(shù)后面
4粪牲、默認(rèn)參數(shù)值
使用=在可選參數(shù)指定默認(rèn)值 默認(rèn)參數(shù)值只能是編譯期常量
??:
void main () {
printPerson("Sunny",gender: "Male");
}
// 可選命名參數(shù){}
printPerson(String name,{int age = 20, String gender = "Female"}) {
print("name = $name, age = $age, gender = $gender"); // 打印結(jié)果:name = Sunny, age = 20, gender = Male
}
5古瓤、方法對(duì)象
5.1 方法可以作為對(duì)象賦值給其他的對(duì)象
??:
void main() {
var func = printHello;
func();
List list = [1,2,3,4];
list.forEach(print);// 輸出:1,2腺阳,3落君,4
void printHello() {
print("Hello Dart");
}
5.2 方法可以作為參數(shù)傳遞給其他方法
??:
void main() {
print(listPrint(["D","a","r","t"], timers)); // 打印結(jié)果:[DDD,aaa,rrr,ttt]
}
// 傳入一個(gè)字符串 把這個(gè)字符串打印3次
String timers (str) {
return str * 3;
}
List listPrint(List list,timers) {
for(int index = 0; index < list.length; index++) {
list[index] = timers(list[index]);
}
return list;
}
6、匿名方法
匿名方法的特性:
6.1 可賦值給變量 通過變量來(lái)進(jìn)行調(diào)用
6.2 可以在其他方法中直接調(diào)用或傳遞給其他的方法
(參數(shù)1亭引,參數(shù)2) {
方法體
return 返回值
}
??:
void main () {
var func = (){
print("Hello Dart");
};
func();
print(listPrint(["1","2","3","4"], (str){ return str*3;}));// 打印結(jié)果:[111,222,333,444]
}
List listPrint(List list,timers) {
for(int index = 0; index < list.length; index++) {
list[index] = timers(list[index]);
}
return list;
}
7绎速、閉包
閉包也是一個(gè)方法(對(duì)象),閉包定義在其他方法內(nèi)部焙蚓,閉包能夠訪問外部變量的局部變量 并持有其狀態(tài)
??:
void main() {
var func = funca();
func(); // 0
func(); // 1
func(); // 2
}
funca () {
int count = 0;
printCount() {
print(count++);
}
return printCount;
}
也可以是下面的寫法:
void main() {
var func = funca();
func(); // 0
func(); // 1
func(); // 2
}
funca () {
int count = 0;
return () {
print(count++);
};
}
五纹冤、Dart面向?qū)ο缶幊?/h2>
1洒宝、類與對(duì)象
使用關(guān)鍵詞class
來(lái)聲明一個(gè)類
使用關(guān)鍵字new
來(lái)創(chuàng)建一個(gè)類 new
可忽略
所有的對(duì)象默認(rèn)都繼承Object
屬性與方法:
默認(rèn)會(huì)生成setter
和 getter
使用final
關(guān)鍵字聲明的屬性 只會(huì)生成getter
在Dart中方法是不能被重載的
類及成員的可見性:
在Dart中的可見性是一以library
為單位的
默認(rèn)情況下 每一個(gè)Dart文件就是一個(gè)庫(kù)library
使用表示庫(kù)的私有性(表示屬性、方法的私有性也是通過來(lái)表示的)
使用import
導(dǎo)入庫(kù)
??:
import 'person.dart';
void main() {
var person = new Person();
person.name = "Sunny";
person.age = 18;
// person.bookName = "123";
person.work();
print(person.bookName);
}
// person.dart文件
class Person {
String name;
int age;
final String bookName = "《平凡的世界》";
void work() {
print("name = $name, age = $age, She is working...");// name = Sunny, age = 18, She is working...
}
}
??:如果Person前面使用了_
就表示是私有萌京,其他類就找不到這個(gè)類了
class _Person {
}
2雁歌、 計(jì)算屬性
計(jì)算屬性的值是通過計(jì)算得來(lái)的 本身并不存儲(chǔ)值
計(jì)算屬性賦值 其實(shí)是通過計(jì)算轉(zhuǎn)換到其他的實(shí)例變量
??:
void main () {
var rect = Rectangle();
rect.width = 10;
rect.height = 20;
print(rect.area);
rect.area = 200;
print(rect.width);
}
class Rectangle {
num width;
num height;
// 計(jì)算屬性getter
num get area {
return width * height;
}
// 計(jì)算屬性setter
set area(value) {
width = value/ 10;
}
}
3、構(gòu)造方法
如果沒有自定義的構(gòu)造方法知残,會(huì)有一個(gè)默認(rèn)的構(gòu)造方法
??:
void main() {
var person = new Person();
}
class Person {
// 默認(rèn)的構(gòu)造方法
Person () {
}
}
如果存在自定義的構(gòu)造方法靠瞎,則默認(rèn)的構(gòu)造方法就無(wú)效
自定義構(gòu)造方法的寫法一??:
void main() {
var person = new Person("Sunny", 18);
person.work();
}
class Person {
String name;
int age;
void work() {
print("name = $name, age = $age, She is working...");// name = Sunny, age = 18, She is working...
}
// 構(gòu)造方法
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
自定義構(gòu)造方法的寫法二??:
void main() {
var person = new Person("Sunny", 18,"Female");
person.work();
}
class Person {
String name;
int age;
final gender;
void work() {
print("name = $name, age = $age, She is working...");// name = Sunny, age = 18, She is working...
}
Person(this.name, this.age,this.gender) {
print(this.gender);// Female
}
}
??:如果對(duì)person的gender賦值,第一種構(gòu)造方法就不能使用求妹,因?yàn)椴荒軐?duì)final
修飾的屬性賦值较坛,但是第二種構(gòu)造方式是可以的,因?yàn)榈诙N的構(gòu)造方法賦值是在構(gòu)造方法之前
構(gòu)造方法不能重載扒最,但是可以使用重命名的構(gòu)造方法
??:
void main() {
var person = new Person.withName("Sunny");
person.work();
}
class Person {
String name;
int age;
final gender;
void work() {
print("name = $name, age = $age, She is working...");// name = Sunny, age = 18, She is working...
}
Person.withName(this.name) {
print(this.name); // Sunny
}
}
4丑勤、常量構(gòu)造方法
如果類是不可變的狀態(tài),可以把對(duì)象定義為編譯時(shí)常量
使用const來(lái)聲明構(gòu)造方法吧趣,并且所有變量都是final
使用const聲明對(duì)象法竞,可以省略
??:
void main() {
const person = const Person("Sunny", 18,"Female");
person.work();
}
class Person {
final name;
final age;
final gender;
void work() {
print("name = $name, age = $age, She is working...");// name = Sunny, age = 18, She is working...
}
const Person(this.name, this.age,this.gender);
}
5、工廠構(gòu)造方法
工廠構(gòu)造方法類似于設(shè)計(jì)模式里面的工廠模式
在構(gòu)造方法添加factory
實(shí)現(xiàn)一個(gè)構(gòu)造方法
在工廠構(gòu)造方法里面可以返回對(duì)象
??:
void main() {
var logger = Logger("Sunny");
print(logger.name);
}
class Logger {
final String name;
static final Map<String,Logger> _cache = <String, Logger>{};
factory Logger(String name) {
if(_cache.containsKey(name)) {
return _cache[name];
}else {
final logger = Logger._internal(name);
_cache[name] = logger;
return logger;
}
}
// 表示這個(gè)方法是私有
Logger._internal(this.name);
}
6强挫、初始化列表
初始化列表會(huì)在構(gòu)造方法之前執(zhí)行
使用岔霸,
分隔初始化表達(dá)式
初始化列表常用于設(shè)置final
變量的值
??:
void main() {
// var person = new Person("Sunny", 18,"Female");
var person = new Person.withMap({"name":"Sunny","age":18});
person.work();
}
class Person {
String name;
final age;
final gender;
void work() {
print("name = $name, age = $age, She is working...");// name = Sunny, age = 18, She is working...
}
Person(this.name, this.age,this.gender);
Person.withMap(Map map):age = map["age"], gender = map["gender"] {
this.name = map["name"];
print("name = $name,age = $age,gender = $gender"); // name = Sunny,age = 18,gender = null
}
}
7、靜態(tài)成員
使用 static
關(guān)鍵字來(lái)實(shí)現(xiàn)類級(jí)別的變量和函數(shù)
靜態(tài)成員不能訪問非靜態(tài)成員俯渤,非靜態(tài)成員可以訪問靜態(tài)成員
類中的常量需要使用static const
聲明
??:
void main() {
var page = Page();
Page.scrollDown(); // 不能通過page.scrollDown()來(lái)調(diào)用
}
class Page {
static const maxPage = 10;
static int currentPage = 1;
// 下滑
static void scrollDown() {
currentPage = 1;
print("scrollDown...");
}
// 上滑
void scrollUp() {
currentPage++;
print("scrollUp...");
}
}
8呆细、對(duì)象操作符
條件成員訪問:?
類型轉(zhuǎn)換:as
是否是指定類型:is is八匠!
級(jí)聯(lián)操作:..
??:
void main () {
// Person person;
// person.work();// 會(huì)報(bào)錯(cuò) 因?yàn)閜erson是空
// person?.work(); // 不會(huì)報(bào)錯(cuò) 檢查到person是nil 就不往下執(zhí)行
// var person;
// person = "Sunny";
// person = new Person();
// (person as Person).work();
// if(person is Person) {
// print("person is Person...");
// }
// if(person is! Person) {
// print("person is String...");
// }
var person = new Person();
person..name = "Sunny"
..age = 18
..work();
}
class Person {
String name;
int age;
void work() {
print("working...");
}
}
9絮爷、對(duì)象call方法(不建議使用)
如果類使用了call()方法 則該類的對(duì)象可以作為方法使用
??:
void main() {
var person = new Person();
person("Sunny",18);
}
class Person {
String name;
int age;
call(String name,int age) {
print("name = $name, age = $age, She is working...");// name = Sunny, age = 18, She is working...
}
}
10、繼承
使用extends
表示繼承一個(gè)類
繼承可以繼承父類可見的方法和屬性梨树,不會(huì)繼承構(gòu)造方法
子類能夠復(fù)寫父類的setter 和 getter
單繼承坑夯、多態(tài)
??:
void main() {
var student = new Student();
student.name = "Sunny";
student.age = 18;
print(student.isAdult);
student.study();
student.run();
}
class Student extends Person {
void study() {
print("Student is studying...");
}
@override
bool get isAdult => age >15; // 重寫父類的方法
@override
void run() {
super.run();
print("Student is running...");
}
}
Person
:
class Person {
String name;
int age;
String _birthday;
bool get isAdult => age > 18;
void run () {
print("person is running...");
}
}
11、繼承中的構(gòu)造方法
子類的構(gòu)造方法默認(rèn)會(huì)去調(diào)用父類的無(wú)名無(wú)參的構(gòu)造方法
如果父類沒有無(wú)名無(wú)參的構(gòu)造方法 則需要顯式調(diào)用父類的構(gòu)造方法
在構(gòu)造方法參數(shù)后面使用:
顯式調(diào)用父類的構(gòu)造方法
??:
void main() {
var student = new Student("Sunny", 18,"Female");
}
class Person {
String name;
int age;
Person(this.name,this.age);
Person.initWithNameAndAge(this.name,this.age);
}
class Student extends Person {
final gender;
// 方式1
// Student(String name, int age) : super(name, age);// 使用快捷鍵可以自動(dòng)補(bǔ)全
// 方式2
Student(String name, int age,String gender) :gender = gender, super.initWithNameAndAge(name,age);
// 方式3
// Student.initWithNameAndAge(String name, int age) : super.initWithNameAndAge(name,age);
}
??:初始化列表和`super`的順序不能交換 會(huì)報(bào)錯(cuò)
構(gòu)造方法的執(zhí)行順序:父類的構(gòu)造方法在子類的構(gòu)造方法開始執(zhí)行之前去調(diào)用
12抡四、抽象類
抽象類使用 abstract
表示 不能直接被實(shí)例化
抽象方法不適用 abstract
修飾 無(wú)實(shí)現(xiàn)
抽象類可以沒有抽象方法
有抽象方法的類一定得聲明為抽象類
??:
void main () {
var student = new Student();
student.run();
}
abstract class Person {
void run();
}
class Student extends Person {
@override
void run() {
// TODO: implement run
print("Student is running....");
}
}
13柜蜈、接口
在Dart中 類和接口是統(tǒng)一的 類就是接口
每個(gè)類都隱式定義了一個(gè)包含所有實(shí)例成員的接口
如果是復(fù)用已有類的實(shí)現(xiàn) 使用extends
如果只是使用已有類的一些外在行為 使用接口implements
??:
void main () {
var student = new Student();
student.run();
}
abstract class Person {
void run();
}
class Student implements Person {
@override
void run() {
print("Student is running...");
}
}
14、Mixins
Mixins 類似于 多繼承 是在多繼承中使用一個(gè)類代碼的方式
Mixins不能有顯式聲明構(gòu)造方法
Mixins的類只能繼承自O(shè)bject
使用關(guān)鍵字with連接一個(gè)或多個(gè)mixin
??:
void main () {
var d = new D();
d.a(); // 輸出:C...a 跟mixins順序有關(guān) 最后是C 所以會(huì)輸出C類里面a的打印
}
class A {
void a() {
print("A....a");
}
}
class B {
void a() {
print("B....a");
}
void b() {
print("B....b");
}
}
class C {
void a() {
print("C....a");
}
void c() {
print("C....c");
}
}
// 現(xiàn)在 如果希望一個(gè)類D 能夠有ABC三個(gè)類的方法
class D extends A with B,C {
}
15指巡、操作符覆寫
覆寫操作符需要在類中定義:
返回類型 operator 操作符 (參數(shù)1淑履,參數(shù)2...) {
實(shí)現(xiàn)體
return 返回值
}
如果需要覆寫 == 還需要覆寫對(duì)象的hashCode getter方法
??:
void main () {
var person1 = new Person();
person1.age = 18;
var person2 = new Person();
person2.age = 20;
print(person1 > person2); // false
}
class Person {
int age;
// 覆寫操作符
bool operator > (Person person) {
return this.age > person.age;
}
}
六、枚舉和泛型
1藻雪、枚舉
枚舉是一種有窮序列集的數(shù)據(jù)類型
使用關(guān)鍵字 enum 來(lái)定義一個(gè)枚舉
常用于代替常量 和 控制語(yǔ)句
Dart中枚舉特性:
index 從0開始 依次累加
不能指定原始值
不能添加方法
??:
void main() {
var cuurentSeason = Season.Summer;
switch(cuurentSeason) {
case Season.Spring:
print("Spring...");
break;
case Season.Summer:
print("Summer...");
break;
case Season.Automn:
print("Automn...");
break;
case Season.Winter:
print("Winter...");
break;
Default:
print("None...");
}
}
enum Season {
Spring,
Summer,
Automn,
Winter
}
2秘噪、泛型
Dart中類型是可選的 可使用泛型指定類型
使用泛型能有效的減少代碼的重復(fù)
類的泛型
方法的泛型
??:
void main () {
var utils = new Utils();
utils.put<String>("Sunny");
utils.put<int>(1);
}
class Utils {
void put<T>(T element) {
print(element);
}
}