應(yīng)用場(chǎng)景:
- Web開發(fā)
- 跨平臺(tái)移動(dòng)應(yīng)用開發(fā)(flutter)
- 腳本或服務(wù)端開發(fā)
開發(fā)環(huán)境搭建:
SDK安裝:
Window平臺(tái): choco install dart-sdk
Linux平臺(tái): sudo apt-get install dart
Mac平臺(tái): brew tap dart-lang/dart 然后 brew install dart --devel
node: 在mac上我進(jìn)行手動(dòng)安裝的
IDE安裝:
node: 我用的vscode,安裝拓展Dart2.22.3和Code Runner
Dart語言入門
dart一切都是對(duì)象
Hello World
- main方法是固定寫法,它是程序入口
- print方法可以在控制臺(tái)輸出內(nèi)容
- 通過文件選擇run,可以運(yùn)行文件中的main方法
//Main 程序入口
void main(){
//控制臺(tái)打印
print("Hello World!");
}
變量
使用var聲明變量,可復(fù)制不同類型的值
未初始化時(shí),默認(rèn)為null
-
使用final聲明一個(gè)只能賦值一次的變量
var a; print(a); a = 10; print(a); a = 'Hello Dart'; print(a); var b = 20; print(b); final c = 30; //c = "Dart";//給c賦值打印會(huì)報(bào)錯(cuò)
常量
-
使用const聲明常量
const d = 20; // d = 50;//給d賦值打印會(huì)報(bào)錯(cuò)
數(shù)據(jù)類型
內(nèi)置類型:
-
數(shù)值型-Number
? 整形-Int
? 浮點(diǎn)型-double
字符串-String
布爾型-Boolean
列表-List
鍵值對(duì)-Map
Runes、Symbols(不常用)
數(shù)值型操作:
運(yùn)算符: +、-、*、/、~/取整、%取余
常用屬性: isNaN是否是非數(shù)字、isEven、isOdd等
-
常用方法: abs()、round()、floor()、ceil()、toInt()、toDouble()
num aa = 10; aa = 12.5; int bb = 20; // bb = 20.5; double cc = 10.5; cc = 30; print(bb + cc); print(bb - cc); print(bb * cc); print(bb / cc); print(bb ~/ cc);//取整 print(bb % cc);// 取余 print(bb.isEven);//是否是偶數(shù) print(bb.isOdd);//是否是奇數(shù) int dd = -100; print(dd.abs());//取絕對(duì)值 double ee = 10.5; print(ee.round());//四舍五入 print(ee.floor());//不大于ee的最接近ee的整數(shù) print(ee.ceil());//不小于ee的最接近ee的整數(shù) print(bb.toDouble());//整形轉(zhuǎn)浮點(diǎn)型 print(ee.toInt());//浮點(diǎn)型轉(zhuǎn)整形
字符串-String
- 使用單引號(hào),雙引號(hào)創(chuàng)建字符串
- 使用三個(gè)引號(hào)或雙引號(hào)創(chuàng)建多行字符串
- 使用r創(chuàng)建原始raw字符串
String str1 = 'hello';// ""
String str2 = ''' hello
Dart''';//'''
print(str2);
String str3 = 'hello \n Dart';
print(str3);
String str4 = r'hello \n Dart';//打印原始內(nèi)容,不轉(zhuǎn)意
print(str4);
字符串操作:
- 運(yùn)算符:+、*、==、[]
- 插值表達(dá)式: ${expression}
- 常用屬性: length、isEmpty、isNotEmpty
String str5 = "This is my favorite language";
print(str5 + "New");//加
print(str5 * 5);//乘
print(str4 == str5);//判斷兩個(gè)str3和str4是否相等
print(str5[0]);//輸出:0
int aaa = 1;
int bbb = 2;
print("aaa + bbb = ${aaa + bbb}");//(插值表達(dá)式)輸出:aaa + bbb = 3
print(str5.length);//str5的長度
print(str5.isEmpty);//判斷str5是否為空
print(str5.isNotEmpty);//判斷是否不為空
字符串常用方法:
- contains(),subString()
- startsWith(),endsWith()
- indexOf(),lastIndexOf() //取字符串下表
- toLowerCase(),toUpperCase() //大小寫轉(zhuǎn)換
- trim(),trimLeft(),trimRight() //截取前后的空格
- split(),replaceXXX() //分割字符串 + 替換
print(str5.contains("Tiis"));//str5是否包含"This"字符
print(str5.substring(0,3));//截取str5第0個(gè)字符到第3個(gè)字符
print(str5.startsWith("a"));//str5是否以字母a開頭
print(str5.endsWith("e"));//str5是否以字母e結(jié)尾
var list = str5.split(" ");//str5以字符空格分割成數(shù)組
print(list);//輸出: [This, is, my, favorite, language]
print(str5.replaceAll("This","That"));//將str5中的This字符替換為That
布爾型-bool
- 使用bool表示布爾類型
- 布爾值只有true和false
bool isTrue = true;
bool isFalse = false;
print("Hello".isEmpty);
List( 數(shù)組)創(chuàng)建
- 創(chuàng)建List: var list = [1,2,3];
- 創(chuàng)建不可變的List: var list = const[1,2,3];
- 構(gòu)造創(chuàng)建:var list = new List();
///List數(shù)組
var list1 = [1,"Dart",true];
print(list1);
print(list1[1]);
list[1] = "Hello";
print(list1);
var list2 = const [1,2,3];
// list2[0] = 5;
var list3 = new List();//list的創(chuàng)建
List-常用操作
- [],length
- add(),insert()
- remove(),clear()
- indexOf(),lastIndexOf()
- sort(),sublist()
- shuffle()數(shù)組打亂順序,asMap(),forEach()
var list4 = ["hello","dart"];
print(list4.length);//數(shù)組元素個(gè)數(shù)
list4.add("new");//數(shù)組添加元素
print(list4);
list4.insert(1,"java");//插入java字符到數(shù)組1位置
print(list4);
list4.remove("java");//數(shù)組移除java字符
print(list4);
// list4.clear();//數(shù)組清空元素
// print(list4);
print(list4.indexOf("dart"));//如果找到的話,返回元素所在的位置;找不到的話,會(huì)返回-1
list4.sort();//排序
print(list4);
print(list4.sublist(1));//截取從第二個(gè)元素開始
list4.forEach(print);//對(duì)數(shù)組的每個(gè)元素執(zhí)行一次提供的函數(shù)(傳入函數(shù)作為參數(shù))
Map-創(chuàng)建
創(chuàng)建Map:var language = {'first':'Dart','second':'Java'};
創(chuàng)建不可變Map:var language = const{'first':'Dart','second':'Java'};
構(gòu)造創(chuàng)建: var language = new Map();
var map1 = {"first":"dart",1:true}; print(map1); print(map1["first"]); print(map1[1]); map1[1] =false; print(map1); var map2 =const{1:"Dart",2:"java"}; // map2[1] = "python";//不能給不可變Map賦值 var map3 = new Map()
Map-常用操作
- [],length
- isEmpty(),isNotEmpty()
- Keys,values
- containsKey(),containsValue()
- remove()
- forEach()
void main() { var map = {"first":"dart","second":"java","third":"python"}; print(map.length); // map.isEmpty; print(map.keys);//打印所有map的key print(map.values);//打印所有map的值 print(map.containsKey("first"));//map是否包含某個(gè)key print(map.containsValue("C"));//map是否包含某個(gè)值 map.remove("third");//移除third對(duì)應(yīng)的值 print(map); map.forEach(f);//給每個(gè)值增加f方法 var listMap = ["1","2","3"];//list轉(zhuǎn)Map print(listMap.asMap()); } void f(key,value){ print("key=$key,value=$value"); }
dynamic
/// dynamic 指任意類型
dynamic bcde = 20;
bcde = "JavaScript";
var listW =new List<dynamic>();//泛型
listW.add(1);
listW.add("hello");
listW.add(true);
print(listW);
運(yùn)算符
算術(shù)運(yùn)算符
- 加減乘除: +,-,*,/,~/,%
- 遞增遞減: ++var,var++,--var,var--
關(guān)系運(yùn)算符
- 運(yùn)算符: ==,!=,>,<,>=,<=
- 判斷內(nèi)容是否相同使用==
邏輯運(yùn)算符
- 運(yùn)算符: !,&&,||
- 針對(duì)布爾類型運(yùn)算
/// 邏輯運(yùn)算符
bool isTrue = true;
print(!isTrue);
bool isFalse =false;
print(isTrue && isFalse);
print(isTrue || isFalse);
String str = "";
print(!str.isEmpty);
賦值運(yùn)算符
- 基礎(chǔ)運(yùn)算符: =,??=
- 復(fù)合運(yùn)算符: +=,-=,*=,/=,%=,~/=
/// 賦值運(yùn)算符
double acc = 10;
int bcc;
bcc ??= 10;//如果bcc值為空,則bcc=10
print(bcc);
acc /= 2;//復(fù)合運(yùn)算的一個(gè)例子
print(acc);
條件表達(dá)式
- 三目運(yùn)算符: condition ? expr1 : expr2
- ??運(yùn)算符: expr1 ?? expr2
int gender = 0;
String strcc = gender == 0 ? "Male=$gender" : "Female=$gender";//三目運(yùn)算符
print(strcc);
String aee ;
String bee = "Java";
String cee = aee ?? bee;//如果aee為空就等于bee
print(cee);
控制流語句
條件語句
- if語句
- if...else if語句
- if...else if…else語句
int score = 90;
if (score >= 90) {
print("優(yōu)秀");
}else if (score > 60) {
print("良好");
}else if (score == 60) {
print("及格");
}else {
print("不及格");
}
循環(huán)語句
- for循環(huán)
- for...in循環(huán)
var listff = [1,2,3,4,5];
for (var i = 0; i < listff.length; i++) {
print(listff[i]);
}
for (var item in listff) {
print(item);
}
while語句
- while循環(huán)
- do...while循環(huán)
/// while語句
int countff = 0;
while (countff<5) {
print(countff ++);
}
print("--$countff----");
do {//先執(zhí)行do語句再執(zhí)行while里面的判斷
print(countff--);
} while (countff > 0 && countff<5);
break和continue
- 終止循環(huán): break
- 跳出當(dāng)前循環(huán): continue
var listgg = [1,2,3];
for (var item in listgg) {
if (item == 2) {
//break;
continue;//跳出當(dāng)前循環(huán),繼續(xù)執(zhí)行下個(gè)循環(huán)
}
print(item);
}
print("-------------");
for (var item1 in listgg) {
for (var item2 in listgg) {
if (item2==5) {
break;//break是終止它所在的for循環(huán)(離它最近的for循環(huán))
}
print(item2);
}
}
switch…case語句
- 比較類型: num,String,編譯期常量,對(duì)象,枚舉
- 非空case必須有一個(gè)break
- default處理默認(rèn)情況
- continue跳轉(zhuǎn)標(biāo)簽
/// switch...case語句
String languagegg = "Dart";
switch (languagegg) {
case "Dart":
print("Dart is my favorite");
break;
case "Java":
print("Java is my favorite");
break;
case "Python":
print("Python is my favorite");
break;
default:
print("None");
}
switch (languagegg) {
case "Dart":
print("Dart is my favorite");
continue Testgg;//跳轉(zhuǎn)到Testgg標(biāo)簽去執(zhí)行操作
// break;
case "Java":
print("Java is my favorite");
break;
Testgg:
case "Python":
print("Python is my favorite");
break;
default:
print("None");
}
方法
方法定義
返回類型 方法名 (參數(shù)1, 參數(shù)2,....) {
? 方法體...
? return 返回值
}
void main() {
/// 方法
print(getPerson("張三", 18));
}
void f(key,value){
print("key=$key,value=$value");
}
方法特性
- 方法也是對(duì)象,并且有具體類型Function
- 返回值類型、參數(shù)類型都可以省略
- 箭頭語法: =>expr 是{return expr;}縮寫.只適用于一個(gè)表達(dá)式
- 方法都有返回值.如果沒有指定,默認(rèn)return null最后一句執(zhí)行
String getPerson(String name,int age){
return "name = $name,age=$age";
}
getPersonJX(name,age) => "name=$name,age=$age";//箭頭函數(shù)簡(jiǎn)寫上面函數(shù)
int gender = 1;
getPrentJX2(name,age) => gender == 1 ? "name=$name,age=$age" : "test";//箭頭函數(shù)加表達(dá)式
void canNotGetPerson(String name,int age){//無返回值類型
print("name=$name,age=$age");
}
printPerson(name,age){//方法簡(jiǎn)寫
print("name=$name,age=$age");
}
可選參數(shù)
- 可選命名參數(shù):{param1,param2,...}
- 可選位置參數(shù):[param1,param2,...]
- 如果存在具體參數(shù),可選參數(shù)聲明,必須在參數(shù)后面
void main() {
//可選命名參數(shù)
newPerson("小強(qiáng)");
newPerson("小紅",age:20);
newPerson("小紅",age:20,gender: "Male");
//可選位置參數(shù)
newPerson2("小綠",18,"Male");
}
newPerson(String name,{int age,String gender}){//基于命名可選參數(shù)(多用)
print("name=$name,age=$age,gender=$gender");
}
newPerson2(String name,[int age,String gender]){//基于位置可選參數(shù)
print("name=$name,age=$age,gender=$gender");
}
默認(rèn)參數(shù)值
- 使用 = 在可選參數(shù)指定默認(rèn)值
- 默認(rèn)值只能是編譯時(shí)常量
newDefault(String name,{int age,String gender = "Female"}){//默認(rèn)參數(shù)值
print("name=$name,age=$age,gender=$gender");
}
方法對(duì)象
- 方法可以作為對(duì)象賦值給其他變量
- 方法可作為參數(shù)傳遞給其它方法
void main() {
//方法作為對(duì)象
var func = printHello;
func();
Function func2 = printHello;
func2();
//方法作為函數(shù)參數(shù)使用
var listhh = [1,2,3,4];
listhh.forEach(print);
var listii = ["h","e","l","l","0"];
print(listTimes(listii,times));
}
void printHello() {
print("hello");
}
List listTimes(List list,String t(str)){
for (var i = 0; i < list.length; i++) {
list[i] =t(list[i]);
}
return list;
}
String times(str){
return str*3;
}
匿名方法
(參數(shù)1,參數(shù)2,...) {
? 方法體...
? return 返回值
}
匿名方法特性
- 可賦值給變量,通過變量進(jìn)行調(diào)用
- 可在其它方法中直接調(diào)用或傳遞給其它方法
void main() {
//匿名函數(shù)
var funcii = (str){
print("hello---$str");
};
funcii(30);
// ((){
// print("Test");
// })();
var listll = ["h","e","l","l","o"];
var result = listTimes(listll, (str){return str * 3;});
print(result);
}
List listTimes(List list,String t(str)){
for (var i = 0; i < list.length; i++) {
list[i] =t(list[i]);
}
return list;
}
閉包
- 閉包是一個(gè)方法(對(duì)象)
- 閉包定義在其它方法內(nèi)部
- 閉包能夠訪問外部方法內(nèi)的局部變量,并持有其狀態(tài)
void main() {
///閉包
var funcmm =ann();
funcmm();
funcmm();
funcmm();
funcmm();
}
amm(){
int count = 0;
printCount(){
print(count++);
}
return printCount;
}
ann(){
int count = 0;
// printCount(){
// print(count++);
// }
return (){
print(count++);
};
}