前言
Flutter使用的是Dart語(yǔ)言,我們先來(lái)了解Dart的一些基礎(chǔ)特性,便于后面Flutter的開發(fā)。
變量聲明
舉例:
var name = '小明';
var age = 18;
String nameStr = "小紅";
int ageInt = 18;
dynamic address = '北京';
Object money = 100;
總共有四種:
1、var
var name = '小明';
var age = 18;
使用 var 來(lái)聲明變量,不需要特別指定變量的數(shù)據(jù)類型。
注意:為什么 var 聲明的變量不需要指定數(shù)據(jù)類型,而能定義所有的變量呢?
因?yàn)?var 存儲(chǔ)的是值的對(duì)象的引用,而不是直接存儲(chǔ)的值。
2、明確的數(shù)據(jù)類型
String nameStr = "小紅";
int ageInt = 18;
在聲明變量的時(shí)候,就使用明確的數(shù)據(jù)類型。
Dart 支持以下的數(shù)據(jù)類型:
1、int:整數(shù),范圍為 -2^63 到 2^63 - 1。比如:int x = 1;
2、double:浮點(diǎn)數(shù),64位(雙精度)浮點(diǎn)數(shù)。比如:double y = 1.1111;
3、num:是數(shù)字類型,既可以表示整數(shù),也可以表示浮點(diǎn)數(shù),具體看賦的值。比如:num x = 1;//x是整數(shù),num y = 1.1111;//y是浮點(diǎn)數(shù);
4、String:字符串,Dart 字符串采用UTF-16編碼,可以使用單引號(hào)或雙引號(hào)來(lái)創(chuàng)建字符串。比如:String s = 'test' 或 String = “test”;
5、bool:布爾值。比如:bool isBoy = true;
6、List、Set、Map
7、Runes:表示采用 UTF-32 的字符串,用于顯示 Unicode 因?yàn)?Dart 字符串是 UTF-16,所以需要 Runes 這個(gè)特殊語(yǔ)法轉(zhuǎn)換一下。
3、dynamic
dynamic address = '北京';
dynamic 表明數(shù)據(jù)類型是動(dòng)態(tài)可變的。它和 var 一樣,可以定義任何變量,但是不同的是,var 一旦賦值后,就不能改變數(shù)據(jù)類型了,但是 dynamic 可以,比如:
如果 var 這樣使用,就會(huì)有編譯錯(cuò)誤:
var a = 'test';
a = 1;
如果 dynamic 能夠通過(guò)編譯,但是會(huì)在運(yùn)行時(shí)報(bào)錯(cuò):
dynamic a = "test";
a = 1;
4、Object
Object money = 100;
Dart 里所有東西都是對(duì)象,是因?yàn)?Dart 的所有東西都繼承自 Object,因此 Object 可以定義任何變量,并且賦值后,也可以改變類型。
object a = 1;
a = "test";
注意:一般都用Object代替dynamic,而不使用dynamic。
修飾常量用的:final 和 const
在用 final 和 const 修飾不想改變的值時(shí),需要注意一下幾點(diǎn):
- 使用 final 和 const 的時(shí)候可以把 var 省略
- final 和 const 變量只能賦值一次,而且只能在聲明的時(shí)候就賦值
- const 是隱式的 final,在使用 const 的時(shí)候,如果變量是類里的變量,必須加 static,是全局變量時(shí)不需要加
final 和 const 區(qū)別:
const 是編譯時(shí)常量,在編譯時(shí)就初始化,值就確定了。
final 是當(dāng)類創(chuàng)建的時(shí)候才初始化。
List、Set 和 Map
List
//使用構(gòu)造函數(shù)創(chuàng)建對(duì)象
var list = List<int>();
list.add(1);
list.add(2);
//通過(guò)字面創(chuàng)建對(duì)象,list的泛型參數(shù)可以從變量定義推斷出來(lái)
var list2 = [1,2,3];
//沒(méi)有元素,顯示指定泛型參數(shù)為int
var list3 = <int>[];
list3.add(1);
list3.add(2);
var list4 = const[1,2];
//list4 指向的是一個(gè)常量,不能給它添加元素。也不能修改它
list4.add(3);//error
//list4 本身不是一個(gè)常量,所以它可以指向另一個(gè)對(duì)象
list4 = [4,5];//ok
Set
Set<E>,E 表示 Set 里的數(shù)據(jù)類型,用大括號(hào)來(lái)賦值:
Set<String> set = {"aaa","bbb","cccc"};
var set = Set<String>();
set.add('aaa');
set.add('bbb');
Map
//第一種寫法:
Map map = new Map<String,int>();
//添加
map['a'] = 1;
map['b'] = 2;
//修改
map['a'] = 3;
//獲取map值
int i = map['a'];
//第二種寫法:
Map<String,String> map2 = {
"a":"aaa",
"b":"bbb",
"c":"ccc"
};
操作符
主要分為一下幾類:
- 算術(shù)運(yùn)算符
- 比較操作符
- 類型判斷符
- 賦值操作符
- 邏輯運(yùn)算符
- 按位與移位運(yùn)算符
- 條件運(yùn)算符
- 級(jí)聯(lián)操作符
- 其他操作符
1. 算術(shù)操作符
- +:加
- -: 減
- *:乘
- %:取余
- -var:負(fù)數(shù)
-
++/--:加1/減1
以上這些都和 Java 中的一樣,不同的是 除: - /:除,精確除法。比如var a = 3 / 2;結(jié)果 a 為 1.5
- ~/:整除。比如var a = 3 ~/ 2;結(jié)果 a 為 1
2. 比較操作符
==、!=、>、<、>=、<= 這些比較操作符和 Java 中一樣
3. 類型判斷符
- as:類型轉(zhuǎn)換。注意:轉(zhuǎn)換的對(duì)象不能為null。
- is:判斷是否是某個(gè)類型,如果是的話,就返回 true。
- is!:判斷是否不是某個(gè)類型,如果不是的話,就返回 true。
4. 賦值操作符
- =:賦值操作符
- ??=:只有當(dāng)變量為空的時(shí)候才能賦值
5. 邏輯運(yùn)算符
!、||、&& 這些邏輯符和 Java 一樣
6. 按位與移位運(yùn)算符
- &:按位與,對(duì)于每一個(gè)比特位,只有兩個(gè)操作數(shù)相應(yīng)的比特位都是1時(shí),結(jié)果才為1,否則為0
- |:按位或,對(duì)于每一個(gè)比特位,當(dāng)兩個(gè)操作數(shù)相應(yīng)的比特位至少有一個(gè)1時(shí),結(jié)果為1,否則為0
- ^:按位異或,對(duì)于每一個(gè)比特位,當(dāng)兩個(gè)操作數(shù)相應(yīng)的比特位有且只有一個(gè)1時(shí),結(jié)果為1,否則為0
- ~:按位非,反轉(zhuǎn)操作數(shù)的比特位,即0變成1,1變成0
- <<:左移
- >>:右移
7. 條件運(yùn)算符
- "? :": 同 Java 中 if else
- var1 ?? var2:如果 var1 為null,就返回 var2,否則返回 var1
8. 級(jí)聯(lián)操作符
- ..:允許你對(duì)同一對(duì)象進(jìn)行一系列的操作。
9. 其他操作符
- {}:函數(shù)調(diào)用
- []:訪問(wèn)列表
- .:訪問(wèn)成員變量
- ?. :有條件的成員變量訪問(wèn)
語(yǔ)句
在Java中常用的 if else,switch,while 和 do while 在 Dart 里面都支持。
函數(shù)
在 Dart 中函數(shù)也是對(duì)象,函數(shù)的類型是 Function。
模版格式:
返回類型 函數(shù)名(函數(shù)參數(shù)){
}
函數(shù)的參數(shù):必選參數(shù)和可選參數(shù)
- 必選參數(shù)是必填的
- 可選參數(shù)是選填的
必須參數(shù)
必選參數(shù)就是平時(shí)的方法定義的函數(shù)參數(shù),比如:
bool(String name,int age){
}
可選參數(shù)
分為兩類:
- 可選命名參數(shù):使用 {} 包起來(lái)的參數(shù)是可選命名參數(shù)
- 可選位置參數(shù):使用 [] 包起來(lái)的參數(shù)是可選位置參數(shù)
- 可選命名參數(shù) {}
可選參數(shù)的賦值必須是 key : value 這種格式,比如:
bool(String name,{int age,int id}){
}
這里參數(shù) age 就是可選命名參數(shù)。
同時(shí)還可以給命名參數(shù)加 @required,意思是這個(gè)也是必填參數(shù)。
bool(String name,{@required int age,int id}){
}
- 可選位置參數(shù):[]
賦值和參數(shù)是一一對(duì)應(yīng)的。
bool('小明',"123456");//不對(duì),他是有順序的
lambda表達(dá)式
=> 語(yǔ)句后面只能跟一行代碼,而且這一行代碼只能是一個(gè)表達(dá)式,而不能跟語(yǔ)句。表達(dá)式可以是函數(shù)、值。
void main() => runApp(MyApp());
等價(jià)于
void main(){
return runApp(MyApp());//runApp() 返回的是 void
}
異常
拋出異常:
throw Exception('put your error message here');
捕獲異常:
try {
// ...
// 捕獲特定類型的異常
} on FormatException catch (e) {
// ...
// 捕獲特定類型的異常,但不需要這個(gè)對(duì)象
} on Exception {
// ..
// 捕獲所有異常
} catch (e) {
// ...
} finally {
// ...
}
跟 Java 不同的是,Dart 可以拋出任意類型的對(duì)象。
類
Dart 中每個(gè)對(duì)象都是一個(gè)類的實(shí)例,所有類都繼承自 Object。
class Test{
int x;
int y;
Test(int x,int y){
this.x = x;
this.y = y;
}
}
默認(rèn)構(gòu)造函數(shù)的寫法就是使用類名作為函數(shù)名的構(gòu)造函數(shù),Dart 還有更簡(jiǎn)潔的寫法,
Test(this.x,this.y);
另外,在創(chuàng)建實(shí)例的時(shí)候,可以不使用 new。
Test test = Test(1, 2);
總結(jié)
Dart 的簡(jiǎn)單學(xué)習(xí)到此就結(jié)束了,我們主要學(xué)習(xí)了變量聲明、final 和 const、List Set和Map、操作符、語(yǔ)句、函數(shù)、lambda 表達(dá)式和異常。如果想要了解更多的 Dart 語(yǔ)法,可以去看官方文檔(https://dart.dev/guides/language/language-tour)。