前言 為什么學(xué)習(xí)Dart娃胆?
Dart
語法簡潔高效,擁有數(shù)以千計(jì)的packages 生態(tài)系統(tǒng)Dart
提供提前編譯優(yōu)化斑司,以在移動(dòng)設(shè)備和 web 上實(shí)現(xiàn)可預(yù)測的高性能和快速啟動(dòng)Dart
可以編譯成 ARM 和 x86 代碼,因此 Dart 移動(dòng)應(yīng)用程序可以在 iOS,Android 及 更高版本上實(shí)現(xiàn)本地運(yùn)行。 對于 web 應(yīng)用程序碍庵,Dart
可以轉(zhuǎn)換為 JavaScript
4.Dart
是面向?qū)ο蟮木幊陶Z言,語法風(fēng)格對于許多現(xiàn)有的開發(fā)人員來說都很熟悉悟狱。 如果您有一定的面向?qū)ο缶幊陶Z言的基礎(chǔ) 静浴,那么使用 Dart
也就是分分鐘的事情
5.Dart
可以便捷的進(jìn)行響應(yīng)式編程。由于快速對象分配和垃圾收集器的實(shí)現(xiàn)挤渐, 對于管理短期對象(比如 UI 小部件)苹享, Dart
更加高效。 Dart
可以通過 Future 和 Stream 的特性和API實(shí)現(xiàn)異步編程浴麻。
- 同時(shí)也為
Flutter
學(xué)習(xí)打下一定的基礎(chǔ)
二. 語言特點(diǎn)
1. Dart
是一門純粹的面向?qū)ο笳Z言,在Dart
中一切皆對象;函數(shù)(函數(shù)可以作為參數(shù)傳遞)得问,字符串,數(shù)字等都是對象软免。
如下代碼宫纬,數(shù)字可以調(diào)用對象方法
var text = 666.toString();
print(text);
函數(shù)作為對象傳遞
var list = [1, 2, 3];
printEle(element) {
print("輸出值 is $element");
}
list.forEach(printEle);
系統(tǒng)函數(shù)
forEach
參數(shù)要求傳一個(gè)函數(shù)
/**
* Applies the function [f] to each element of this collection in iteration
* order.
*/
void forEach(void f(E element)) {
for (E element in this) f(element);
}
2. Dart
是一門強(qiáng)類型語言(js是一門弱類型語言),但也支持一些弱類型特性如:var
膏萧、object
漓骚、dynamic
等;
var
實(shí)際上是編譯器語法糖榛泛,聲明變量后會自動(dòng)推導(dǎo)類型蝌蹂,不可更改賦值類型dynamic
表示動(dòng)態(tài)任意類型,可以賦值任意類型挟鸠,編譯階段不檢測類型叉信,被編譯后是object
類型object
表示動(dòng)態(tài)任意類型亩冬,可以賦值任意類型艘希,編譯階段檢查類型測試以下代碼(可以打開注釋硼身,方便理解)*
var p1 = 1;
Object p2 = 2;
dynamic p3 = 3;
//p1 = 'A';編譯期會報(bào)錯(cuò);A value of type 'String' can't be assigned to a variable of type 'int'.
// p1 = 'A';
// p2,p3改變類型不會報(bào)錯(cuò),因?yàn)槎急硎救我忸愋? p2 = 'B';
p3 = 'C';
//p2 因?yàn)镺bject編譯期會檢查類型覆享,發(fā)現(xiàn)p2沒有未定義 run函數(shù) 而報(bào)錯(cuò) ;The method 'run' isn't defined for the type 'Object'.
// p2.run();
//p3 dynamic編譯器不檢測類型佳遂,不會報(bào)錯(cuò),運(yùn)行時(shí)拋出異常撒顿;NoSuchMethodError: Class 'String' has no instance method 'run'.
p3.run();
print(p1);
print(p2);
print(p3);
- 兼具編譯性語言特點(diǎn)和解釋性語言特點(diǎn)
- 對開發(fā)web應(yīng)用來講:dart會被轉(zhuǎn)譯成js
- 對app丑罪、服務(wù)端、桌面應(yīng)用講:dart提供了開發(fā)模式凤壁,通過vm解釋執(zhí)行吩屹,支持熱更新,具有解釋型語言特點(diǎn)拧抖;也提供了生產(chǎn)模式煤搜,通過編譯成機(jī)器碼執(zhí)行,具有編譯型語言特點(diǎn)
三.開始學(xué)習(xí)吧
1. Dart
支持以下基本數(shù)據(jù)類型:
- Numbers
- Strings
- Booleans
- List(數(shù)組)
- Maps(字典鍵值對)
2. 變量聲明:
- 可以顯示聲明指明類型唧席,方便編譯器做一些靜態(tài)檢查如:
int age = 18;
- 可以
var
聲明類型擦盾,變量初始化后自動(dòng)推導(dǎo)類型,并且不可更改賦值類型
var p1 = 1;
注意以下寫法也是正確的:
var name;
name = "無名氏";
name = 18;
name.run();
print(name);
聲明時(shí)不賦值則等同于聲明了一個(gè)動(dòng)態(tài)類型(dynamic)變量
-
static final const
關(guān)鍵字
-
static
:用于修飾成員變量淌哟,這個(gè)變量是屬于類的迹卢,而不是屬于對象的,除此之外沒有其他別的含義了 -
final
修飾的變量不許進(jìn)行初始化徒仓,賦值之后不能再改變腐碱;編譯期和運(yùn)行期確定值都可以 -
const
修飾變量,必須進(jìn)行初始化掉弛,賦值之后不能再改變喻杈,該變量必須編譯器就確定,否則會報(bào)錯(cuò)
getInfo() {
return "個(gè)人信息";
}
const name = "我愛學(xué)習(xí)啊";
//報(bào)錯(cuò)狰晚,因?yàn)榫幾g期間不能確定info值;Const variables must be initialized with a constant value.
const info = getInfo();
final name1 = "我也愛學(xué)習(xí)";
//不報(bào)錯(cuò)
final info1 = getInfo();
const
還可以用來構(gòu)造對象筒饰;表明該對象在編譯期就能夠完全確定,所以該對象類所有屬性都必須使用final 或者 const
修飾壁晒,也就是說該對象所有屬性都是不能改變的既該對象是不可變的瓷们;
void main() {
People p = const People("flutter");
}
class People {
final name;
const People(name) : this.name = name;
}
如果對象類屬性不適用final修飾,則該對象某個(gè)屬性是可變的秒咐,那么該對象就不能被稱為是不可變的谬晕,所以會報(bào)錯(cuò);
void main() {
People p = const People("flutter");
}
class People {
final name;
//也可以
static const height = 180;
int age;
//Can't define a const constructor for a class with non-final fields.
const People(name) : this.name = name;
}
const
構(gòu)造集合,說明該集合完全不可變携取,類似OC中不可變集合攒钳;
const array = const [1, 2, 3];
array[0] = 0;
//運(yùn)行時(shí)報(bào)錯(cuò);Unhandled Exception: Unsupported operation: Cannot modify an unmodifiable list
print(array);
相同的
const
變量雷滋,內(nèi)存中只會創(chuàng)建一次
var list1 = const [1, 2, 3];
var list2 = const [1, 2, 3];
//判斷是否指向同一個(gè)對象
bool result = identical(list1, list2);
if (result) {
print("是同一個(gè)對象");
} else {
print("不是同一個(gè)對象");
}
輸出flutter: 是同一個(gè)對象
- 變量未初始化的默認(rèn)值:
在Dart中未初始化變量都為null不撑,null也是Object子類
var name;
int age;
Object people;
List list;
dynamic dy;
print(name);
print(age);
print(people);
print(list);
print(dy);
全輸出null
5.類型判斷:
a is Object
去判斷
//輸出 true
print(null is Object);
//輸出 true debug下輸出文兢,release忽略
assert(null is Object);
- 類型轉(zhuǎn)換:
Dart
是強(qiáng)類型語言,所以需要顯示轉(zhuǎn)換焕檬。常見的轉(zhuǎn)換:
String aa = "111";
//String-> int
int bb = int.parse(aa);
// int -> double
double cc = bb.toDouble();
// String -> double
double dd = double.parse("1.1");
// num -> String
aa = cc.toString();
//double指定位數(shù) ->String
String ee = 3.141592.toStringAsFixed(3); //結(jié)果為3.141