1.
const是編譯時就要確定值,所以不能這樣寫:
const datetime tim=datetime(); //因為datetime()的值只有運(yùn)行時才能確定。
Final是第一次運(yùn)行時需要確定值,所以可以這樣寫:
Final datetime tim=datetime();//因為datetime()的值運(yùn)行時才會確定,final關(guān)鍵字支持這樣的用法
Const和final的相同點是二者的值都無法再次更改,區(qū)別在于初始化時間。const是編譯時就要確定值,而final可以在第一次運(yùn)行時確定值。另外,使用這兩個關(guān)鍵字修飾變量都可以省略變量類型,如:
Final a=DateTime.now();
Const b=5;
2.
類大括號外面沒有分號,如:
Class p{
Pass….
}
3.
只有一個語句的函數(shù)可以用胖箭頭簡寫法,如
int f(var x){
return x*x;
}
再如:
void f(var t)=>print(t);
4.
typedef Fly = void Function(int value);//Fly是定義了一個方法,該方法只有一個int形參,F(xiàn)ly不是特定的函數(shù),而是一個類型,可以用來定義變量。Fly類型的變量都是特定的具體函數(shù)。
void main(){
Bird bird = Bird((int a){print(a);});//如果實參函數(shù)的類型不是該類型的話 編譯不通過
bird.fly(3);//bird是Bird類型的變量,Bird類中有一個Fly類型的變量,而Fly類型就是一個方法類型,所以fly成員變量就是一個特定的方法(函數(shù)),所以可以這樣調(diào)用:bird.fly(3)
Bird類定義在下面:
class Bird{
Fly fly;
Bird(this.fly);
}
5.
函數(shù)位置參數(shù)使用方括號[]括起來: int f(int x, int y,[int z]){} //z是可選的形參
函數(shù)命名參數(shù)用大括號{}括起來:int f({String name,String Sex}){},可以這樣調(diào)用:
f(name:’wangziyou’,Sex:’Male’);
但二者不能同時使用
6.
斷言assert,assert內(nèi)部包含一個返回bool的表達(dá)式,如果返回false,那么assert就會拋出error暫停調(diào)試。正常使用方式是:對于不確定是否會報錯的語句加上assert,如果正常運(yùn)行不會拋出異常就代表這個語句沒有問題。
7.
Dart中的String可以用單引號或者雙引號擴(kuò)起來,兩種都行。
8.
var p=['1','2','3','4']; //p是list<int>類型的
var x=p.join('*'); //把p里的各個字符用*拼起來—-》;’1*2*3*4
print(x.split('*')); //把x用*作為分割符,分割為不同的字符串,保存在list里
如果字符串每個字符都分開,比如’abcd’—>’a’ ‘b’ ‘c’ ‘d’
寫法是:p.split(‘’)即可,注意括號里是不帶空格的,兩個單引號是連著的。
之后再拼起來也是.join(‘’),括號里面也是不帶空格的。
9.
dart的future對象用于異步調(diào)用,它的成員函數(shù)貌似返回的也都是future對象(這一點待確定)
10.
Dart中a/b結(jié)果為double類型的,如果想得到整數(shù)結(jié)果需要:a~/b
11.
is 、as 屬于Type test operators。
is 判斷是否是某個類型,返回true或者false。
如果a 是b的實現(xiàn)類,那么a is b 就返回true。
as 是類型轉(zhuǎn)換,其相當(dāng)于 :先檢測 其是不是,然后再調(diào)用的一種簡寫。
但是還不是完全一致,當(dāng)不是的時候,as 會拋出exception。
if (emp is Person) {
// Type check
emp.firstName = 'Bob';
}
可以簡寫為:
(emp as persion).firstName='Bob';
如果emp 不是persion,name就會拋出exception。
12.
??=也是賦值符,但只有在被賦值的變量為空時。如果不為空,則不做任何事情。
// 賦值給a
a = value;
// 如果b為空,則將值分配給b;否則,b保持不變
b ??= value;
??是條件運(yùn)算符:
expr1 ?? expr2
如果expr1為非空,則返回其值;否則,計算并返回expr2的值。
13.
..是極聯(lián)符(不算運(yùn)算符,只是dart語法的一部分),它表示對前一句的對象進(jìn)行一系列調(diào)用,只要是對象就行,不需要是某個函數(shù)的返回結(jié)果。栗子:
void main(){
List p=[];
p
..length
..clear()
..sort();
}
這段代碼相當(dāng)于p.length; p,clear(); p.sort();
注意極聯(lián)的縮進(jìn)
14.
Dart支持函數(shù)的嵌套定義
15.
Dart中所有函數(shù)都有返回值。
沒有顯示返回語句的函數(shù)最后一行默認(rèn)為執(zhí)行 return null;。
foo() {}
assert(foo() == null);
16.
Dart中捕獲異常通過try on/catch來實現(xiàn),on可以指定具體的異常類型,catch則可以捕獲異常對象:catch(e),然后可以輸出e的信息。
try {
breedMoreLlamas();
} on OutOfLlamasException {
// 指定異常
buyMoreLlamas();
} on Exception catch (e) {
// 其它類型的異常
print('Unknown exception: $e');
} catch (e) {
// // 不指定類型,處理其它全部
print('Something really unknown: $e');
}
17.
兩個使用相同構(gòu)造函數(shù)相同參數(shù)值構(gòu)造的編譯時常量是同一個對象:
var a = const ImmutablePoint(1, 1);
var b = const ImmutablePoint(1, 1);
assert(identical(a, b)); // 它們是同一個實例 (They are the same instance!)
18.
子類中可以通過super.xxxx()來調(diào)用父類的方法
19.
繼承這樣寫的:
class Person {
int age;
string name;
Person(int age, String name){
this.age = age;
this.name = name;
}
void sayhi(){
print('my name is' this.name)
}
}
class Worker extend Person{
int salary;
Worker(int age, string name, int salary) : super(age, name){ //super表示要繼承父類的屬性
this.salary = salary;
}
@override //告訴編譯器和程序員他是一個重寫覆蓋父類的方法
void sayhi(){ super.sayhi() //表示調(diào)用父類的sayhi方法
print('my salary is'+ this.salary)
}
}
20.
dart中系統(tǒng)默認(rèn)類型的數(shù)據(jù)(比如int/num這種基本的數(shù)據(jù)類型),兩個相同值的不同變量是=的
但如果是自己定義的類,但是沒有重載=運(yùn)算符,甚至是官方的map/set/list進(jìn)行=比較,都會返回false:
因為dart中的所有類型都是object的子類,所以如果沒有單獨定義=運(yùn)算符,那么對兩個變量進(jìn)行=運(yùn)算,都使用的是object的=運(yùn)算符,而object的=運(yùn)算符是用于檢測參數(shù)與接收者是否相同,所以就會出現(xiàn)下面這種奇怪的情況,c++里是不會有這種情況的:

需要operator= (another) {return xxxxx;}來對=運(yùn)算符進(jìn)行重載,這樣就可以通過=判斷是否相等了。
然后如果還有需要判斷是否相同的需求,可以使用identical(a,b)的方法,該方法定義在dart:core庫中。
21.
set方法寫法:set(another)=> xx=another.xx;
get方法寫法:get=>xxxx; //注意get方法是不帶參數(shù)列表的(不帶參數(shù)括號!)
|