前言:Google為什么選擇
- 基于JIT的快速開發(fā)周期
Flutter在開發(fā)階段采用JIT模式彪腔,這樣就避免了每次改動都要進行編譯碉输,極大的節(jié)省了開發(fā)時間债鸡; - 基于AOT的發(fā)布包
Flutter在發(fā)布時可以通過AOT生成高效的ARM代碼以保證應(yīng)用性能箩兽。
為了快速流暢的用戶體驗需要能夠在每個動畫幀運行大量的代碼沃疮,不能有周期性的停頓薇溃,否則會造成掉幀菌赖。 - 單線程:
不需要鎖,不存在數(shù)據(jù)競爭和變量狀態(tài)同步沐序,也沒有線程上下文切換的性能損耗和鎖導(dǎo)致的卡頓琉用。 - 垃圾回收
多生代無鎖垃圾回收器,專門為UI框架中常見的大量Widgets對象創(chuàng)建和銷毀優(yōu)化策幼。
一. 變量和數(shù)據(jù)類型Dart語言
- 常量:
從未打算更改的一個變量邑时,那么使用 final 或 const,不是var特姐,也不是一個類型晶丘。 一個 final 變量只能被設(shè)置一次,兩者區(qū)別在于:const 變量是一個編譯時常量唐含,final變量在第一次使用時被初始化浅浮。被final或者const修飾的變量,變量類型可以省略
//可以省略String這個類型聲明
final str = "hi world";
//final String str = "hi world";
const str1 = "hi world";
//const String str1 = "hi world";
- 變量:Dart使用var聲明變量捷枯,他并不是一個類型滚秩,類型會自動識別的,var變量一旦賦值淮捆,類型便會確定郁油,則不能再改變其類型
var t;
t = "hi world";
// 下面代碼在dart中會報錯,因為變量t的類型已經(jīng)確定為String攀痊,
// 類型一旦確定后則不能再更改其類型桐腌。
t = 1000;
- 基本數(shù)據(jù)類型: Number、String苟径、Boolean哩掺、List、Map
//Number:int和double
int score = 100;
double per = 3.14;
//string
String name = "anfly";
//boolean
bool isValid = true;
//string轉(zhuǎn)義
String s = 'I\'m anfly';
String s1 = "I'm anfly";
//string拼接
//注意:不同類型的數(shù)據(jù)不能拼接涩笤,跟Java有所區(qū)別嚼吞,Java可以強轉(zhuǎn)為string
// print("我的成績是" + score);
print("我的成績是:${score}");
//StringBuffer實現(xiàn)字符串拼接,但用的不是append
StringBuffer sb= StringBuffer();
sb.write("");
//$變量
int a = 20;
int b = 40;
print("the sum of $a and $b is ${a + b}");
//List類型:具有相同類型的數(shù)據(jù)蹬碧,使用方式和數(shù)組一樣
var list = [1,2,3];//自動識別類型
//Map 類型
//方式一:
var weeks ={'Monday':'星期一','Tuesday':'星期二'};
//方式二:使用map的構(gòu)造函數(shù)
var weeks = new Map();
weeks["Monday"] = "星期一";
weeks["Tuesday"] = "星期二";
//第二種方式可以增加一個值
weeks["Wednesday"] = "星期三";
//檢查key是否在map中
assert(week["Monday"]==null)
//list轉(zhuǎn)map舱禽,map轉(zhuǎn)list
list.map()
map.tolist()
- dart分支:if switch
//if操作符
double salery = 2000;
if (salery < 2000) {
print("$salery 小于2000");
} else if (salery > 2000) {
print("$salery 大于2000");
} else {
print("$salery 等于2000");
}
if (a > b) {
print("$a is salery");
} else {
print("$b is salery");
}
//三元操作符 ?: 表達式
a > b ? print("$a is salery") : print("$b is salery");
//??表達式恩沽,判空誊稚,如果為空可默認(rèn)??后邊的內(nèi)容
//區(qū)分null和""
String myName = null;
String newName = myName ?? "anfly";
print(newName);
//switch,用法和Java中一樣的
String grade = "A";
switch (grade) {
case "A":
print("very good");
break;
case "B":
print("good");
break;
case "C":
print("enough good");
break;
}
- 循環(huán)
//for罗心,知道循環(huán)次數(shù)
for (int i = 0; i < 4; i++) {
print(i);
}
List people = ["a", "b", "c"];
for (int i = 0; i < people.length; i++) {
print(people[i]);
}
//for in
for (String person in people) {
print(person);
}
//while,不知道循環(huán)次數(shù)
int i = 0;
while (i < people.length) {
print(people[i]);
i++;
}
//do while
do {
print(people[i]);
i++;
} while (i < people.length);
//break 停止當(dāng)前循環(huán)
for (int i = 0; i < 10; i++) {
if (i == 5) break;
}
//指定停止的循環(huán)
outterLoop:
for (int i = 0; i < 10; i++) {
innerLoop:
for (int j = 0; j < 10; j++) {
if (j == 4) {
break outterLoop;
}
}
}
//continue退出本次循環(huán)
for (int i = 0; i < 10; i++) {
if (i == 5) continue;
}
- 函數(shù)的9個知識點:
//1.函數(shù)定義
void sumValue() {
int a = 1;
int b = 2;
int sum = a + b;
print("a+b=${sum}");
}
//2.函數(shù)傳參
void sumValue(int a, int b) {
int sum = a + b;
print("a+b=${sum}");
}
//3.函數(shù)返回值
int sumValue(int a, int b) {
int sum = a + b;
return sum;
}
//4.箭頭函數(shù)(無返回值)
void sumValue(int a, int b) => print("a+b=${a + b}");
//5.箭頭函數(shù)(有返回值),不需要加return
int sumValue(int a, int b) => a + b;
//6.函數(shù)參數(shù)(可選參數(shù))
//帶有可選參數(shù)的函數(shù):
void printCites(String c1, [String c2, String c3]) =>
print("城市一:${c1}\n城市二:${c2}\n城市三:${c3}");
//調(diào)用:調(diào)用的地方可以不后前兩個參數(shù)
printCites("北京");
//7.函數(shù)參數(shù) 命名里伯,如果形參被花括號包含,調(diào)用的時候就要指明形參名稱
//函數(shù)
void printCites(String c1, String c2, {String c3}) =>
print("城市一:${c1}\n城市二:${c2}\n城市三:${c3}");
//調(diào)用
printCites("北京", "上海", c3: "天津");
//8.函數(shù)默認(rèn)返回值
//函數(shù)
int sumValue(int a, int b) {
int sum = a + b;
}
//調(diào)用
print(sumValue(2, 2));
結(jié)果:null
//9.函數(shù)參數(shù) 賦默認(rèn)值
void printCites(String c1, String c2, [String c3 = "深圳"]) =>
print("城市一:${c1}\n城市二:${c2}\n城市三:${c3}");
//調(diào)用的時候可以不賦值渤闷,直接用默認(rèn)的參數(shù)值
printCites("北京", "上海", );
5.類
//1.類的基礎(chǔ)知識
//2.構(gòu)造函數(shù)
//3.自定義構(gòu)造函數(shù)
class Student {
String name = "大飛";
int age = 18;
//構(gòu)造與
//空參構(gòu)造
// Student() {
// print("構(gòu)造函數(shù)");
// }
//實參構(gòu)造
// Student(String name, int age) {
// this.name = name;
// this.age = age;
// }
Student(this.name, this.age); //簡寫實參構(gòu)造
//自定義構(gòu)造函數(shù)
Student.CustomConstructor(this.name, this.age) {
print("自定義構(gòu)造函數(shù)");
}
void study() {
print("${this.name} 正在學(xué)習(xí)呢");
}
}
//調(diào)用
var student = Student("awf", 10);
// student.name = "anfly";
// student.age = 28;
// print("姓名是${student.name} and 年齡是${student.age}");
// student.study();
var student2 = Student.CustomConstructor("anfly",12);
print("姓名是${student.name} and 年齡是${student.age}");
- 繼承和重寫父類的方法
//1.自定義setter和getter方法
//2.類的繼承:跟Java一樣單繼承
//3.重寫父類的方法和屬性
var student = Student();
student.name = "大飛";//調(diào)用默認(rèn)setter方法
print(student.name);//調(diào)用默認(rèn)getter方法
student.setName("大飛");//調(diào)用自定義的setter方法
print(student.getName());//調(diào)用自定getter方法
class Student {
String name;
int age;
void setName(String name) => this.name = name
String getName() => return this.name;
}