版權(quán)聲明:本文為作者原創(chuàng)書籍放航。轉(zhuǎn)載請注明作者和出處烈拒,未經(jīng)授權(quán)圆裕,嚴(yán)禁私自轉(zhuǎn)載,侵權(quán)必究><浮O抛薄!
情感語錄:時(shí)隔悠悠恍如昨; 成家立業(yè)各自落吨铸。不見當(dāng)年昔日笑; 結(jié)君之情勿淡薄!
Dart預(yù)熱篇:
Dart是由谷歌開發(fā)的計(jì)算機(jī)編程語言,它可以被用于web行拢、服務(wù)器、移動(dòng)應(yīng)用 和物聯(lián)網(wǎng)等領(lǐng)域的開發(fā)诞吱。Dart誕生于2011年舟奠,號(hào)稱要取代JavaScript竭缝。但是過去的幾年中一直不溫不火。直到Flutter的出現(xiàn)現(xiàn)在被人們重新重視沼瘫。要學(xué)好Flutter的前提我們必須得先會(huì)Dart抬纸。
官網(wǎng):https://dart.dev/
Dart環(huán)境搭建:要在我們本地開發(fā)Dart程序的話首先需要安裝Dart Sdk
官方文檔:https://dart.dev/get-dart
windows(推薦):
http://www.gekorm.com/dart-windows/
mac:
如果mac電腦沒有安裝brew這個(gè)工具首先第一步需要安裝它: https://brew.sh/brew tap dart-lang/dart
brew install dart
Dart 開發(fā)工具: Dart的開發(fā)工具有很多: IntelliJ IDEA 、 WebStorm耿戚、 Atom湿故、Vscode等
Dart入坑篇之語法:
對(duì)于有Java 或kotlin語言基礎(chǔ)的同學(xué)來說學(xué)習(xí)Dart將會(huì)變得非常得心應(yīng)手,他既有kotlin中類型推斷和豐富的API也具有Java中的寫法習(xí)慣.且語法也是大同小異。
Dart 語言的關(guān)鍵字:
相比其他語言dart 關(guān)鍵字相對(duì)較多幾個(gè)膜蛔。
Dart的程序入口:
入口方法的兩種定義方式坛猪, 和Java 一樣程序入口也是 main 方法
main(){
//控制臺(tái)打印輸出
print('你好 dart');
}
//表示無返回值的方法
void main(){
//控制臺(tái)打印輸出
print('你好 dart');
print('你好 dart1');
}
Dart的命名規(guī)則:
1、變量名稱必須由數(shù)字皂股、字母墅茉、下劃線和美元符($)組成。
2呜呐、注意:標(biāo)識(shí)符開頭不能是數(shù)字
3躁锁、標(biāo)識(shí)符不能是保留字和關(guān)鍵字。
4卵史、變量的名字是區(qū)分大小寫的如: age和Age是不同的變量战转。在實(shí)際的運(yùn)用中,也建議不要用一個(gè)單詞大小寫區(qū)分兩個(gè)變量。
5以躯、標(biāo)識(shí)符(變量名稱)一定要見名思意 :變量名稱建議用名詞槐秧,方法名稱建議用動(dòng)詞
實(shí)例代碼:
void main() {
//dart里面有類型校驗(yàn)
//var str='';
//str=1234; //提示錯(cuò)誤
//print(str);
String str="2131242";
print(str);
int myNum=1243214;
print(myNum);
var str1='2134214';
//var 2str='xxx'; //錯(cuò)誤 不能用數(shù)字開頭
//var if='124214'; //錯(cuò)誤 關(guān)鍵字
//變量的名字是區(qū)分大小寫的
var age=20;
var Age=30;
print(age);
print(Age);
}
輸出結(jié)果:
2131242
1243214
20
30
Dart 變量:
1、dart是一個(gè)強(qiáng)大的腳本類語言忧设,可以不預(yù)先定義變量類型 刁标,自動(dòng)會(huì)類型推斷
2、dart中定義變量可以通過var關(guān)鍵字可以通過類型來申明變量
如:
var str='this is var';
String str='this is var';
int str=123;
注意: var 后就不要寫類型 址晕, 寫了類型 不要var 兩者都寫 var a int = 5; 報(bào)錯(cuò)
Dart 常量: final 和 const修飾符
const 值不變 一開始就得賦值
final 可以開始不賦值 只能賦一次 ; 而final不僅有const的編譯時(shí)常量的特性膀懈,最重要的它是運(yùn)行時(shí)常量,并且final是惰性初始化谨垃,
即在運(yùn)行時(shí)第一次使用前才初始化
注: 永遠(yuǎn)不改量的量启搂,請使用final或const修飾它,而不是使用var或其他變量類型刘陶。
final name = 'zhengzaihong';
final String nickname = 'zzh';
const double PI = 3.1415926;
實(shí)例代碼:
void main() {
//var 聲明
var strinfo='你好dart';
var numinfo=1234;
print(strinfo);
print(numinfo);
//字符串 指定類型聲明
String str='你好dart';
print(str);
//數(shù)字類型 指定類型聲明
int num=123;
print(num);
}
結(jié)果輸出:
你好dart
1234
你好dart
123
Dart中支持以下數(shù)據(jù)類型:
常用數(shù)據(jù)類型:
Numbers(數(shù)值):
int
double
Strings(字符串)
String
Booleans(布爾)
bool
List(數(shù)組)
在Dart中胳赌,數(shù)組是列表對(duì)象,所以大多數(shù)人只是稱它們?yōu)榱斜? Maps(字典)
通常來說匙隔,Map 是一個(gè)鍵值對(duì)相關(guān)的對(duì)象疑苫。 鍵和值可以是任何類型的對(duì)象。每個(gè)鍵只出現(xiàn)一次, 而一個(gè)值則可以出現(xiàn)多次
項(xiàng)目中用不到的數(shù)據(jù)類型:
Runes
Rune是UTF-32編碼的字符串捍掺。它可以通過文字轉(zhuǎn)換成符號(hào)表情或者代表特定的文字撼短。
main() {
var clapping = '\u{1f44f}';
print(clapping);
print(clapping.codeUnits);
print(clapping.runes.toList());
Runes input = new Runes(
'\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}');
print(new String.fromCharCodes(input));
}
Symbols
Symbol對(duì)象表示在Dart程序中聲明的運(yùn)算符或標(biāo)識(shí)符。您可能永遠(yuǎn)不需要使用符號(hào)挺勿,但它們對(duì)于按名稱引用標(biāo)識(shí)符的API非常有用阔加,因?yàn)榭s小會(huì)更改標(biāo)識(shí)符名稱而不會(huì)更改標(biāo)識(shí)符符號(hào)。要獲取標(biāo)識(shí)符的符號(hào)满钟,請使用符號(hào)文字胜榔,它只是#后跟標(biāo)識(shí)符:
在 Dart 中符號(hào)用 # 開頭來表示,入門階段不需要了解這東西湃番,可能永遠(yuǎn)也用不上夭织。
http://dart.goodev.org/guides/libraries/library-tour#dartmirrors---reflection
數(shù)據(jù)類型?字符串:
void main() {
//1、字符串定義的幾種方式
var str1='this is str1';
var str2="this is str2";
print(str1);
print(str2);
String str3='this is str3';
String str4="this is str4";
print(str3);
print(str4);
String str5='''
this is str5
this is str5
this is str5
''';
print(str5);
String str6="""
this is str6
this is str6
this is str6
""";
print(str6);
//2吠撮、字符串的拼接
String str7='你好';
String str8='Dart';
print("${str7+str8}"); //支持像kotlin中的${} 字符串模板表達(dá)式
print(str7 + str8);
print(str7 +" "+ str8);
//注: 如需要在字符串中保持有換行則需要如下三個(gè)雙引號(hào)或者三個(gè)單引號(hào)成對(duì)出現(xiàn)包裹內(nèi)容
// """ 或者 '''
}
結(jié)果輸出:
this is str1
this is str2
this is str3
this is str4
this is str5
this is str5
this is str5
this is str6
this is str6
this is str6
你好Dart
你好Dart
你好 Dart
數(shù)據(jù)類型?數(shù)值類型
void main() {
//1尊惰、int 必須是整型
int a=123;
a=45;
print(a);
//2、double 既可以是整型 也可是浮點(diǎn)型
double b=23.5;
print(b);
//3泥兰、運(yùn)算符
// + - * / %
var c=a+b;
print(c);
}
結(jié)果輸出:
45
23.5
68.5
數(shù)據(jù)類型?布爾類型
void main() {
// 1弄屡、bool 支持java中的三目運(yùn)算符
var flag=true;
var str = flag?"真":"假";
print(str);
//2、條件判斷語句
var a=123;
var b=123;
if(a==b){
print('a=b');
}else{
print('a!=b');
}
}
結(jié)果輸出:
真
a=b
數(shù)據(jù)類型?List(數(shù)組/集合)
void main() {
//1鞋诗、第一種定義List的方式
var list1=['aaa','bbbb','cccc'];
print(list1);
print(list1.length);
print(list1[1]); //取出下標(biāo)為1的元素
//2膀捷、第二種定義List的方式,用法和java中List 沒什么區(qū)別
var list2=new List();
list2.add('張三');
list2.add('李四');
list2.add(1);
print(list2);
//3、定義List指定類型
var list3=new List<String>();
list3.add('張三');
//list3.add(123);//提示不支持的數(shù)據(jù)類型
print(list3);
}
輸出結(jié)果:
[aaa, bbbb, cccc]
3
bbbb
[張三, 李四, 1]
[張三]
數(shù)據(jù)類型?Maps(字典)
void main() {
//第一種定義 Maps的方式,如json 格式的鍵值對(duì)
var person={
"name":"張三",
"age":20,
"work":["程序員","送外賣"]
};
print(person);
print(person["name"]);//通過key 取value
print("-----------------");
//第二種定義 Maps的方式 如java中map.put(key,value)
var p=new Map();
p["name"]="李四";
p["age"]=22;
p["work"]=["程序員","送外賣"];
print(p);
print(p["age"]);//通過key 取value
}
結(jié)果輸出:
{name: 張三, age: 20, work: [程序員, 送外賣]}
張三
-----------------
{name: 李四, age: 22, work: [程序員, 送外賣]}
22
Dart判斷數(shù)據(jù)類型 :
Java中判斷數(shù)據(jù)類型的關(guān)鍵字 ' instanceof ' ,Dart和kotlin一致都是使用 ' is ' 關(guān)鍵字判斷
void main() {
var str=123;
if(str is String){
print('是string類型');
}else if(str is int){
print('是int類型');
}else{
print('其他類型');
}
//輸出結(jié)果:是int類型
}
Dart運(yùn)算符和類型轉(zhuǎn)換
1削彬、Dart運(yùn)算符:
算術(shù)運(yùn)算符
+ - * / ~/ (取整) %(取余)
關(guān)系運(yùn)算符
== 全庸!= > < >= <=
邏輯運(yùn)算符
! && ||
賦值運(yùn)算符
基礎(chǔ)賦值運(yùn)算符 = ??= ++ --
復(fù)合賦值運(yùn)算符 += -= *= /= %= ~/=
條件表達(dá)式
if else switch case
三目運(yùn)算符
??運(yùn)算符:
void main() {
int a=13;
int b=5;
print(a+b); //加 18
print(a-b); //減 8
print(a*b); //乘 65
print(a/b); //除 2.6
print(a%b); //其余 3
print(a~/b); //取整 2
var c=a*b;
print('--------');
print(c); // 65
int e=5;
int f=3;
print(e==f); //判斷是否相等 false
print(c!=b); //判斷是否不等 true
print(e>f); //判斷是否大于 true
print(e<f); //判斷是否小于 false
print(e>=f); //判斷是否大于等于 true
print(e<=f); //判斷是否小于等于 false
if(e>f){
print('e大于f'); //輸出 :e大于f
}else{
print('e小于f');
}
/* ! 取反 */
bool flag=false;
print(!flag); //取反 true
/* &&并且:全部為true的話值為true 否則值為false */
bool a1=true;
bool b1=true;
print(a1 && b1); //true
/* ||或者:全為false的話值為false 否則值為true */
bool a2=false;
bool b2=false;
print(a2 || b2); //false
//1、 基礎(chǔ)賦值運(yùn)算符 ??= ++ --
int w =0;
w??=23; //表示如果w為空的話把 23賦值給w 這功能很優(yōu)秀o((≧▽≦o)
print(w); //輸出 0
var q;
var j= q ?? 10;
print(j); // 10
// ++ -- 表示自增 自減 1
// 在賦值運(yùn)算里面 如果++ -- 寫在前面 這時(shí)候先運(yùn)算 再賦值融痛,如果++ --寫在后面 先賦值后運(yùn)行運(yùn)算
// 注:同名成員變量只能定義一次壶笼,方便觀看后面的并未注釋掉.實(shí)際是不可以的喲
var k=10;
var g=k--;
print(k); //9
print(g); //10
var k=10;
var g=k++;
print(k); //11
print(g); //10
var k=10;
var g=++k;
print(k); //11
print(g); //11
var k=10;
var g=--k;
print(k); //9
print(g); //9
//2、 復(fù)合賦值運(yùn)算符 += -= *= /= %= ~/=
var y=12;
y=y+10;
print(y); // 22
var z=13;
z+=10; //表示z=z+10
print(z); // 23
var h=4;
h*=3; //h=h*3;
print(h); // 12
//1雁刷、條件表達(dá)式: if else switch case
//判斷一個(gè)人的成績 如果大于60 顯示及格 如果大于 70顯示良好 如果大于90顯示優(yōu)秀
var score=41;
if(score>90){
print('優(yōu)秀');
}else if(score>70){
print('良好');
}else if(score>=60){
print('及格');
}else{
print('不及格'); // 輸出 不及格
}
//2覆劈、三目運(yùn)算符:上面已經(jīng)講到過, 不再墜述
}
2、類型轉(zhuǎn)換
1沛励、Number與String類型之間的轉(zhuǎn)換
2责语、其他類型轉(zhuǎn)換成bool類型
void main() {
//1、Number與String類型之間的轉(zhuǎn)換
// Number類型轉(zhuǎn)換成String類型 toString() 和java 以及kotlin一致
// String類型轉(zhuǎn)成Number類型 int.parse() java中事通過封裝類轉(zhuǎn)換如:Integer.parseInt() 而kotlin中 是通過toInt() 如 "123".toInt()
String str='123';
var num=int.parse(str);
print(num is int); // true
String str1='123.1';
var num1=double.parse(str1);
print(num1 is double); // true
String price='12';
var num2=double.parse(price);
print(num2);
print(num2 is double); // true
//報(bào)錯(cuò) try ... catch 捕獲異常,和java,kotlin 使用一樣
String prices='';
try{
var num2=double.parse(prices);
print(num2);
}catch(err){
print(0); // 輸出 0
}
var num3=12;
var str2=num3.toString();
print(str2 is String); // true
// 2侯勉、其他類型轉(zhuǎn)換成Booleans類型
// isEmpty:判斷字符串是否為空
var str3='';
if(str3.isEmpty){
print('str3空');// 輸出 str3空
}else{
print('str3不為空');
}
var myNum;
if(myNum==0){
print('0');
}else{
print('非0'); // 輸出 非0
}
var value;
if(value==null){
print('空'); // 輸出 空
}else{
print('非空');
}
var myNum1=0/0;
if(myNum1.isNaN){
print('NaN'); // 輸出 NaN
}
}
Dart中的循環(huán):
1鹦筹、Dart中for循環(huán):
//for基本語法
for (int i = 1; i<=100; i++) {
print(i);
}
//第一步,聲明變量int i = 1;
//第二步址貌,判斷i <=100
//第三步,print(i);
//第四步,i++
//第五步 從第二步再來练对,直到判斷為false
2遍蟋、Dart中while循環(huán):
//語法格式:
while(表達(dá)式/循環(huán)條件){
}
do{
語句/循環(huán)體
}while(表達(dá)式/循環(huán)條件);
//注意: 1、最后的分號(hào)不要忘記
// 2螟凭、循環(huán)條件中使用的變量需要經(jīng)過初始化
// 3虚青、循環(huán)體中,應(yīng)有結(jié)束循環(huán)的條件螺男,否則會(huì)造成死循環(huán)棒厘。
3、Dart中的break和continue流程控制:
/*
break語句功能:
1下隧、在switch語句中使流程跳出switch結(jié)構(gòu)奢人。
2、在循環(huán)語句中使流程跳出當(dāng)前循環(huán),遇到break 循環(huán)終止淆院,后面代碼也不會(huì)執(zhí)行
強(qiáng)調(diào):
1何乎、如果在循環(huán)中已經(jīng)執(zhí)行了break語句,就不會(huì)執(zhí)行循環(huán)體中位于break后的語句。
2土辩、在多層循環(huán)中,一個(gè)break語句只能向外跳出一層
break可以用在switch case中 也可以用在 for 循環(huán)和 while循環(huán)中
continue語句的功能:
【注】只能在循環(huán)語句中使用,使本次循環(huán)結(jié)束支救,即跳過循環(huán)體重下面尚未執(zhí)行的語句逢净,接著進(jìn)行下次的是否執(zhí)行循環(huán)的判斷渣淳。
continue可以用在for循環(huán)以及 while循環(huán)中,但是不建議用在while循環(huán)中瘩绒,不小心容易死循環(huán)
*/
Dart中的循環(huán)和Java和kotlin都是一直,其他語言也是類似,沒什么好講的启涯,這里就不舉例了欲主!
Dart中集合類型List Set Map詳解 以及循環(huán)語句:
1、Dart中的List:
List里面常用的屬性和方法:
常用屬性:
length 長度
reversed 翻轉(zhuǎn)
isEmpty 是否為空
isNotEmpty 是否不為空
常用方法:
add 增加
addAll 拼接數(shù)組
indexOf 查找 傳入具體值
remove 刪除 傳入具體值
removeAt 刪除 傳入索引值
fillRange 修改
insert(index,value); 指定位置插入
insertAll(index,list) 指定位置插入List
toList() 其他類型轉(zhuǎn)換成List
join() List轉(zhuǎn)換成字符串
split() 字符串轉(zhuǎn)化成List
注:以下是集合的通用用法逝嚎,放在后面單獨(dú)講扁瓢。
forEach 循環(huán);同java 和kt中一樣
map 如kotlin和JDK1.8以上中一樣 可以看做類型轉(zhuǎn)換
where 集合中條件查詢
any 集合中有一個(gè)滿足條件既返回真
every 每一個(gè)都滿足條件返回true 否則返回false
void main() {
List fruits=['香蕉','蘋果','西瓜'];
print(fruits[1]); // 打印數(shù)組: ['香蕉','蘋果','西瓜']
var list=new List();
list.add('111');
list.add('222');
print(list); // 輸出:[111, 222]
//List里面的屬性:
List fruits1=['香蕉','蘋果','西瓜'];
print(fruits1.length); // 3
print(fruits1.isEmpty); //false
print(fruits1.isNotEmpty); //true
print(fruits1.reversed); //對(duì)列表倒序排序 // (西瓜, 蘋果, 香蕉)
var newMyList=fruits1.reversed.toList();
print(newMyList);
//List里面的方法:
List fruits2=['香蕉','蘋果','西瓜'];
fruits2.add('桃子'); //增加數(shù)據(jù) 增加一個(gè)
fruits2.addAll(['桃子','葡萄']); //拼接數(shù)組
print(fruits2); // 輸出:[香蕉, 蘋果, 西瓜, 桃子, 桃子, 葡萄]
print(fruits2.indexOf('蘋x果')); //indexOf查找數(shù)據(jù) 查找不到返回-1 查找到返回索引值
fruits2.remove('西瓜');
fruits2.removeAt(1);
print(fruits2); // 輸出:[香蕉, 桃子, 桃子, 葡萄]
List fruits3=['香蕉','蘋果','西瓜'];
fruits3.fillRange(1, 2,'aaa'); //修改:將下標(biāo)為1開始的元素到下標(biāo)為2的元素修改為 'aaa',注意這里是前閉后開區(qū)間,[ )
// 既不會(huì)取到2的元素,下標(biāo)越界會(huì)拋出 RangeError 異常。
// 此時(shí)結(jié)果['香蕉','aaa','西瓜']
fruits3.insert(1,'aaa'); //插入一個(gè)元素,此時(shí)結(jié)果:['香蕉','aaa',,'aaa','西瓜']
fruits3.insertAll(1, ['aaa','bbb']); //插入多個(gè)元素
print(fruits3); //結(jié)果:[香蕉, aaa, bbb, aaa, aaa, 西瓜]
List fruits4=['香蕉','蘋果','西瓜'];
var str=fruits4.join('-'); //list轉(zhuǎn)換成字符串,可以理解是java中的循環(huán)取出每一個(gè)元素然后字符串拼接或者StringBuffer等方式
print(str); //輸出:香蕉-蘋果-西瓜
print(str is String); // true
var str1='香蕉-蘋果-西瓜';
var list1=str1.split('-');// "按照 '-' 進(jìn)行分割后返回一個(gè)數(shù)組:好比Java中:String[] array = str1.split('-')一樣"
print(list1); // 輸出:[香蕉, 蘋果, 西瓜]
print(list1 is List); // true
}
2补君、Dart中的Set:
1引几、用它最主要的功能就是去除數(shù)組重復(fù)內(nèi)容
2、Set是沒有順序且不能重復(fù)的集合挽铁,所以不能通過索引去獲取值
void main() {
var set=new Set();
set.add('香蕉');
set.add('蘋果');
set.add('蘋果');
print(set); //{香蕉, 蘋果}
print(set.toList()); // [香蕉, 蘋果]
List myList=['香蕉','蘋果','西瓜','香蕉','蘋果','香蕉','蘋果'];
var s=new Set();
s.addAll(myList);
print(s);// {香蕉, 蘋果, 西瓜} 可以看出Set會(huì)自動(dòng)幫我去除重復(fù)元素
print(s.toList()); //[香蕉, 蘋果, 西瓜]
}
2伟桅、Dart中的Map:
Map創(chuàng)建的兩種方式:
1、靜態(tài)創(chuàng)建并賦值
2叽掘、通過關(guān)鍵字new 一個(gè)Map 創(chuàng)建楣铁,可動(dòng)態(tài)添加刪除等(通常使用這種方式)
映射(Maps)是無序的鍵值對(duì):
常用屬性:
keys 獲取所有的key值
values 獲取所有的value值
isEmpty 是否為空
isNotEmpty 是否不為空
常用方法:
remove(key) 刪除指定key的數(shù)據(jù)
addAll({...}) 合并映射 給映射內(nèi)增加屬性
containsValue 查看映射內(nèi)的值 返回true/false
void main() {
//靜態(tài)創(chuàng)建并賦值
Map person={
"name":"張三",
"age":20
};
//通過關(guān)鍵字new 創(chuàng)建,可動(dòng)態(tài)添加刪除等
var m=new Map();
m["name"]="李四";
print(person); // 輸出:{name: 張三, age: 20}
print(m); // 輸出:{name: 李四}
//常用屬性:
Map person1={
"name":"張三",
"age":20,
"sex":"男"
};
print(person1.keys.toList()); // 輸出:[name, age, sex]
print(person1.values.toList()); // 輸出:[張三, 20, 男]
print(person1.isEmpty); //false
print(person1.isNotEmpty); //true
//常用方法:
Map person2={
"name":"張三",
"age":20,
"sex":"男"
};
person2.addAll({
"work":['敲代碼','送外賣'],
"height":160
});
print(person2); // 輸出:{name: 張三, age: 20, sex: 男, work: [敲代碼, 送外賣], height: 160}
person2.remove("sex");
print(person2);// 輸出:{name: 張三, age: 20, work: [敲代碼, 送外賣], height: 160}
print(person2.containsValue('張三')); //true
}
Dart中集合的高階用法( forEach 更扁、map 盖腕、 where 赫冬、 any、every):
void main() {
//list 相關(guān)
List myList1=['香蕉','蘋果','西瓜'];
//普通for循環(huán)
for(var i=0;i<myList1.length;i++){
print(myList1[i]);
}
//增強(qiáng)for循環(huán) 不使用下標(biāo)可以使用
for(var item in myList1){
print(item);
}
// 更簡潔的forEach 循環(huán)
myList1.forEach((value){
print("$value");
});
List numbers=[1,3,4];
//通過map 將每一個(gè)元素按照給定的規(guī)則處理后得到一個(gè)新的Iterable<T>
var newNumbers=numbers.map((value){
return value*2;
});
// 轉(zhuǎn)換成 List集合
print(newNumbers.toList()); // [2, 6, 8]
List numbers1=[1,3,4,5,7,8,9];
// 使用where 查詢滿足條件的元素后得到一個(gè)新的Iterable<T>
var newNumbers1=numbers1.where((value){
return value>5;
});
// 轉(zhuǎn)換成 List集合
print(newNumbers1.toList()); // [7, 8, 9]
List myList=[1,3,4,5,7,8,9];
//只要集合里面有滿足條件的就返回true
var f=myList.any((value){
return value>5;
});
print(f); //true
//每一個(gè)都滿足條件返回true 否則返回false
var flag=myList.every((value){
return value>5;
});
print(flag); //false
//set 相關(guān)
var set=new Set();
//添加一個(gè)list
set.addAll([1,222,333]);
//遍歷輸出
set.forEach((value)=>print(value));
//注意:set 為無序不重復(fù)集合溃列,不能像List中通過for循環(huán)下標(biāo)去取值劲厌。除了用forEach外我們還可以像
// Java中的 迭代器(Iterator)遍歷去取值 如下:
Iterator iterable = set.iterator;
while(iterable.moveNext()){
print(iterable.current); // 結(jié)果和 forEach 是一樣的
}
//map 相關(guān)
Map person={
"name":"張三",
"age":20
};
// 分別取出key 和value,這和kt中一樣,但相比Java 簡單許多
person.forEach((key,value){
print("$key---$value");
});
}
Dart中的變量和方法以及作用域:
1听隐、變量的定義和作用域:
1.方法體內(nèi)的成員變量;隸屬于方法,既在該方法體以及子方法里可以使用补鼻。
2.類成員變量;隸屬于該類,既在該類下都可以使用。
3.全局成員變量雅任;隸屬于整個(gè)應(yīng)用风范。
實(shí)例代碼:
//創(chuàng)建一個(gè)全局變量
var shardInfo = "the life cycle is appliction";
//創(chuàng)建一個(gè)類(后面章節(jié)會(huì)講到,看不懂無所謂)
class TestClass{
// 類成員變量
var variables = "2";
}
main(){
//局部成員變量
int age = 18;
print(age);
}
2、方法的定義和作用域:
方法的作用域:
1沪么、方法體內(nèi)的方法;隸屬于該方法,既在該方法體以及子方法里可以調(diào)用硼婿。
2、類中的方法;隸屬于該類,既在該類里可以調(diào)用或者通過 new 創(chuàng)建對(duì)象后調(diào)用成玫。
3加酵、全局方法:隸屬應(yīng)用,可以看做是在任何地方都能調(diào)用哭当。
4猪腕、匿名方法:依賴與接收者(句柄)的作用域(后面會(huì)講到)
方法的聲明:
內(nèi)置方法/函數(shù):
print();
自定義方法:
自定義方法的基本格式:
返回類型 方法名稱(參數(shù)1,參數(shù)2,...){
方法體
return 返回值;
}
注意:
① 在Dart中方法的返回類型和行參是不必須明確指定的钦勘,但在開發(fā)中應(yīng)需遵守代碼規(guī)范,所以應(yīng)該明確寫出接收值類型防止誤操作和傳參錯(cuò)誤等陋葡!
② 在Dart語言中方法體內(nèi)是還可以定義方法的,像kotlin中一樣。這個(gè)一定得和Java區(qū)別開來彻采。
實(shí)例代碼:
//全局方法
void login(String phone,String pass){
print("${"手機(jī)號(hào):"+phone+" 密碼:"+pass}");
}
class TestClass{
var name;
//類方法
void setName(String name){
this.name = name;
}
}
//演示方法的作用域
void main(){
//方法體中的方法
int getAge(){
var age=18;
return age;
}
String printUserInfo(){
getAge();
return 'this is userInfo';
}
print(printUserInfo());
void action(){
//在方法體內(nèi)定義方法
move(){
print(printUserInfo());
}
move();
}
//move(); //錯(cuò)誤寫法 move()方法的作用域只能在action()方法內(nèi)調(diào)用
action(); //調(diào)用方法
}
Dart中的方法成參數(shù):
方法的參數(shù)(行參)介紹:
1腐缤、行參可以不用寫明參數(shù)類型,為了可讀性和代碼規(guī)范應(yīng)該寫出行參類型
2肛响、可選參數(shù)使用[]進(jìn)行定義,多個(gè)參數(shù)使用","分割開 如:[int age,String sex]
3岭粤、默認(rèn)參數(shù)也是使用[]進(jìn)行定義,顧名思義既在沒有傳入該值是使用默認(rèn)給出的值 如:[String sex='男',int age]
4、命名參數(shù)是有{}進(jìn)行定義,既在調(diào)用時(shí)必須指定名稱和方法中行參名保持一致 如:{int age,String sex='男'}
5特笋、行參接收一個(gè)方法,在參數(shù)列表中不能寫參數(shù)類型剃浇!行參名隨便定義(需見名知意),調(diào)用方式 行參名( )
實(shí)例代碼:
void main(){
//1、定義一個(gè)沒有指定返回類型和接收參數(shù)的方法
printUserInfo(username, age){ //行參
return "姓名:$username---年齡:$age";
}
print(printUserInfo('張三',20)); //實(shí)參 //輸出:姓名:張三---年齡:20
//2猎物、定義一個(gè)帶可選參數(shù)的方法
String printUserInfo2(String username,[int age]){ //行參
if(age!=null){
return "姓名:$username---年齡:$age";
}
return "姓名:$username---年齡保密";
}
print(printUserInfo2('張三',21)); // 姓名:張三---年齡:21
print(printUserInfo2('張三')); // 姓名:張三---年齡保密
//3虎囚、定義一個(gè)帶默認(rèn)參數(shù)的方法
String printUserInfo3(String username,[String sex='男',int age]){ //行參
if(age!=null){
return "姓名:$username---性別:$sex--年齡:$age";
}
return "姓名:$username---性別:$sex--年齡保密";
}
print(printUserInfo3('張三')); //姓名:張三---性別:男--年齡保密
print(printUserInfo3('小李','女')); //姓名:小李---性別:女--年齡保密
print(printUserInfo3('小李','女',30));//姓名:小李---性別:女--年齡:30
//4、定義一個(gè)命名參數(shù)的方法
String printUserInfo4(String username,{int age,String sex='男'}){
if(age!=null){
return "姓名:$username---性別:$sex--年齡:$age";
}
return "姓名:$username---性別:$sex--年齡保密";
}
print(printUserInfo4('張三',age:20,sex:'未知')); //姓名:張三---性別:未知--年齡:20
//5蔫磨、實(shí)現(xiàn)一個(gè)把方法當(dāng)做參數(shù)的方法
action(){
print('this is action');
}
action2(fn){
fn(); // 這里fn() 其實(shí)就是action(),這里理解可能有點(diǎn)抽象
}
//調(diào)用action2這個(gè)方法 把a(bǔ)ction這個(gè)方法當(dāng)做參數(shù)傳入
action2(action);
}
Dart中特別的方法:
1淘讥、匿名方法,既沒有定義方法名
2、自執(zhí)行方法堤如,定義格式((行參....){ 方法體 })(實(shí)參)
實(shí)例代碼
//相當(dāng)于上面講的全局方法,作用域在整個(gè)應(yīng)用
var action;
void main(){
//匿名方法
action=(){
print(123);
};
action();
var action1=(){
print(123);
};
action1();
//自執(zhí)行方法
((int age){
print("我今年${age}歲");
})(18);
//方法的遞歸 求1-100的和 遞歸好像沒啥特別的蒲列,這里只是介紹下
var sum=0;
fn(int n){
sum+=n;
if(n==0){
return;
}
fn(n-1);
}
fn(100);
print(sum);
}
Dart中的閉包:
1窒朋、全局變量特點(diǎn): 全局變量常駐內(nèi)存、全局變量污染全局
2嫉嘀、局部變量的特點(diǎn): 不常駐內(nèi)存會(huì)被垃圾機(jī)制回收炼邀、不會(huì)污染全局
【注】我想實(shí)現(xiàn)的功能: 常駐內(nèi)存且不污染全局怎么辦魄揉?于是Dart中產(chǎn)生了閉包剪侮。
閉包:函數(shù)嵌套函數(shù), 內(nèi)部函數(shù)會(huì)調(diào)用外部函數(shù)的變量或參數(shù), 變量或參數(shù)不會(huì)被系統(tǒng)回收(不會(huì)釋放內(nèi)存)
閉包的寫法: 函數(shù)嵌套函數(shù),并return 里面的函數(shù)洛退,這樣就形成了閉包瓣俯。
實(shí)例代碼:
void main(){
action(){
//不會(huì)污染全局 常駐內(nèi)存
var a=123;
return(){
a++;
print(a);
};
}
var b=action();
b(); // 調(diào)用輸出結(jié)果:124
b(); // 調(diào)用輸出結(jié)果:125
}
由于篇幅問題,涉及到的知識(shí)點(diǎn)也挺多,對(duì)于沒有語言基礎(chǔ)的同學(xué)吸收起來可能要花上些時(shí)間兵怯,如果你有像Java或Kotlin語言基礎(chǔ)的應(yīng)該是很快就能上手,好了本篇點(diǎn)到為止就此結(jié)束彩匕。謝謝大家觀看,下篇內(nèi)容更精彩媒区,再會(huì)M找恰!M噤觥P靼帧!宙攻!