前言
??其實(shí)在2019年初的時(shí)候已經(jīng)看過Dart的入門教學(xué)視頻,那時(shí)候剛開始學(xué)flutter,需要先學(xué)Datr語(yǔ)言,由于在公司一直做的都是原生開發(fā),并沒有真正使用flutter開發(fā),最近打算走混合開發(fā)的路線,所以現(xiàn)在重拾Dart基礎(chǔ),很感謝雷宇老師的視頻教程,這里將看視頻后的筆記整理和歸納,以便日后的復(fù)習(xí),也希望可以幫助到想要入門Dart語(yǔ)言的小伙伴。
變量
- Dart中使用 var 聲明變量, 可賦予不同類型的值
- 未初始化時(shí),默認(rèn)值為null
- 使用final聲明一個(gè)只能賦值一次的變量
void main() {
var a;
print(a);
a = 1;
print(a);
a = "Hello Dart!";
print(a);
}
此時(shí)打印結(jié)果為:
null
1
Hello Dart!
void main() {
final b = 1;
b = "Hello Dart!"; //此處編輯器會(huì)提示有錯(cuò)誤
}
b聲明為final時(shí),只能賦值一次,再次賦值編輯器會(huì)報(bào)錯(cuò)
The final variable 'b' can only be set once.
常量
- Dart中使用const聲明常量
- 使用const聲明的必須是編譯期常量
void main() {
const c = 2;
c = 3; //此處編輯器會(huì)提示有錯(cuò)誤 同上
}
final 和 const的區(qū)別
用final修飾的變量,必須在定義時(shí)將其初始化,其值在初始化后不可改變;
const用來定義常量。const比final更加嚴(yán)格。final只是要求變量在初始化后值不變,但通過final,我們無法在編譯時(shí)(運(yùn)行之前)知道這個(gè)變量的值;而const所修飾的是編譯時(shí)常量,我們?cè)诰幾g時(shí)就已經(jīng)知道了它的值,顯然,它的值也是不可改變的。
數(shù)據(jù)類型
- 數(shù)值型-Number
- 字符串-String
- 布爾型-Boolean
- 列表-List
- 鍵值對(duì)-Map
- Runes、Symbols //比較少用
數(shù)值型
Dart中num為以下兩種類型:
- int 整數(shù)型
- double 浮點(diǎn)型
聲明為num類型的變量,可以賦值為整數(shù)或者浮點(diǎn)數(shù)
void main() {
num a = 10;
a = 10.5;
}
指定為int型的變量,不能賦值為浮點(diǎn)數(shù):
void main() {
int b = 20;
b = 20.5; //此處編輯器會(huì)報(bào)錯(cuò)
}
int 和 double 都是num類的子類,各自的實(shí)現(xiàn)有所不同,int類型的值無法賦值為浮點(diǎn)數(shù),而浮點(diǎn)數(shù)類型的值可以賦值為整數(shù)。
數(shù)值型操作
- 運(yùn)算符:
- + 加
- - 減
- * 乘
- / 處
- ~/ 取整
- % 取余
void main() {
int a = 10;
int b = 20;
print(a+b);
print(a-b);
print(a*b);
print(a/b);
print(a~/b);
print(a%b);
}
打印結(jié)果為:
30
-10
200
0.5
0
10
- 常用屬性:isNaN(是否為非數(shù)字)、isEven(是否為偶數(shù))、isOdd(是否為奇數(shù))等
void main() {
int a = 10;
print(0.0 / 0.0);
print((0.0 / 0.0).isNaN);
print(a.isEven);
print(a.isOdd);
}
打印結(jié)果為:
NaN
true
true
false
由于double類內(nèi)定義了0.0 / 0.0為非數(shù)字,所以 (0.0 / 0.0).isNaN 的結(jié)果為true
- 常用方法:abs()、round()、floor()、ceil()、toInt()、toDouble()
void main() {
int a = -10;
print(a.abs()); //取絕對(duì)值
double b = 10.5;
print(b.round()); //四舍五入
print(b.floor()); //不大于本身的最大整數(shù)
print(b.ceil()); //不小于本身的最小整數(shù)
print(b.toInt()); //轉(zhuǎn)換為整數(shù)
print(a.toDouble()); //轉(zhuǎn)換為浮點(diǎn)數(shù)
}
打印結(jié)果為:
10
11
10
11
-10.0
10
字符串
字符串的創(chuàng)建
- 使用單引號(hào)、雙引號(hào)創(chuàng)建字符串
- 使用三個(gè)引號(hào)或雙引號(hào)創(chuàng)建多行字符串
- 使用r創(chuàng)建原始raw字符串
void main() {
String str1 = 'Hello'; //也可用""
print(str1);
String str2 = '''Hello
Dart'''; //也可用"""
print(str2);
String str3 = "Hello \n Dart";
print(str3);
String str4 = r"Hello \n Dart";
print(str4);
}
打印結(jié)果為:
Hello
Hello
Dart
Hello
Dart
Hello \n Dart
其中str3使用\n轉(zhuǎn)義換行符,打印的結(jié)果帶有換行,而str4在字符串前多了一個(gè)r,表明使用原始的字符串,即\n不會(huì)被解析為換行符,故str4打印結(jié)果為原字符串 Hello \n Dart
字符串操作
- 運(yùn)算符:
- + 拼接
- * 重復(fù)幾次
- == 兩個(gè)字符串是否相同
- [] 取字符串中的字符
void main() {
String str1 = "I";
String str2 = "Love";
String str3 = "Beyond";
print(str1 + str2 + str3);
print(str3 * 3);
print(str1 == str2);
print(str3[3]);
}
打印結(jié)果為:
ILoveBeyond
BeyondBeyondBeyond
false
o
- 插值表達(dá)式:${expression}
void main() {
int a = 1;
int b = 2;
print("a + b = ${a + b}");
print("a = $a,b=$b");
}
打印為結(jié)果:
a + b = 3
a = 1,b=2
- 常用屬性:length(字符串長(zhǎng)度)、isEmpty(是否為空字符串)、isNotEmpty(是否為非空字符串)
void main() {
String str = "beyond";
print(str.length);
print(str.isEmpty);
print(str.isNotEmpty);
}
打印為結(jié)果:
6
false
true
- 常用方法
- contains() 是否包含
- subString() 截取字符串
- toLowerCase() 轉(zhuǎn)換為小寫字母
- toUpperCase() 轉(zhuǎn)換為大寫字母
- startsWith() 是否以某個(gè)字符串開頭
- endsWith() 是否以某個(gè)字符串結(jié)尾
- trim()、trimLeft()、trimRight() 修剪,去除左右空格
- indexOf()、lastIndexOf() 某個(gè)字符串出現(xiàn)的初始下標(biāo)、結(jié)束下標(biāo)
- split() 根據(jù)某個(gè)規(guī)則將字符串分割成一個(gè)字符數(shù)組
- replaceAll() 將字符串中對(duì)應(yīng)字符串替換成某個(gè)字符串
void main() {
String str = " I love beyond ";
print(str.contains("love")); //是否包含love字符串
print(str.substring(1,2)); // [1,2) 左閉右開 即取第2個(gè)字符I
print(str.toLowerCase()); //轉(zhuǎn)換為小寫
print(str.toUpperCase()); //轉(zhuǎn)換為大寫
print(str.startsWith("I")); //是否以I開頭
print(str.endsWith("beyond")); //是否以beyond結(jié)尾
print(str.trim()); //去除兩邊的空格
print(str.indexOf("o")); //首次出現(xiàn)o的下標(biāo)
print(str.lastIndexOf("o")); //最后出現(xiàn)o的下標(biāo)
print(str.split(" ")); //以空格分割
print(str.replaceAll("I", "We")); //替換I為We
}
打印結(jié)果為:
true
I
i love beyond
I LOVE BEYOND
false
false
I love beyond
4
11
[, I, love, beyond, ]
We love beyond
布爾型
- 使用bool聲明
- 布爾值只有true和false
void main() {
bool isTrue = true;
bool isFalse = false;
}
List(數(shù)組)
List(數(shù)組)的創(chuàng)建
- 創(chuàng)建可變List:var list = [1,2,3];
- 創(chuàng)建不可變的List: const list = [1,2,3];
- 構(gòu)造方法創(chuàng)建:var list = new List();
void main() {
var list1 = [1, 2.0, "Dart", true];
list1[0] = "Hello";
list1[1] = "World";
print(list1);
var list2 = const [1,2,3];
//list2[0] = 4; 運(yùn)行時(shí)會(huì)報(bào)錯(cuò) Unsupported operation: Cannot modify an unmodifiable list
var list3 = new List();
list3.add("Hello");
list3.add("World");
print(list3);
}
打印結(jié)果為:
[Hello, World, Dart, true]
[Hello, World]
常用操作
- [] 取出某個(gè)下標(biāo)的元素
- length 數(shù)組的長(zhǎng)度
- add(), insert() 插入元素
- remove() 移除指定位置元素或指定元素
- clear() 清空數(shù)組
- indexOf(), lastIndexOf() 某個(gè)元素首次出現(xiàn)和最后一次出現(xiàn)的下標(biāo)
- sort() 排序
- sublist() 截取
- shuffle() 隨機(jī)打亂
- asMap() 轉(zhuǎn)成map
- forEach()遍歷
void main() {
var list = ["Java","Kotlin","Python"];
print(list[0]); //取第一個(gè)元素
print(list.length); //數(shù)組長(zhǎng)度
//往數(shù)組末尾添加元素
list.add("Js");
print(list);
//往指定位置添加元素
list.insert(0, "PHP");
print(list);
//移除指定位置元素
list.remove(0);
print(list);
//移除數(shù)據(jù)中某個(gè)元素
list.remove("Kotlin");
print(list);
//元素"PHP"首次出現(xiàn)的下標(biāo)
print(list.indexOf("PHP"));
//元素"Js"最后一次出現(xiàn)的下標(biāo)
print(list.lastIndexOf("Js"));
//排序
list.sort();
print("sort result: $list");
print("subList result: ${list.sublist(0,2)}");
print("asMap result: ${list.asMap()}");
list.forEach(print);
//清空數(shù)組
list.clear();
print("clear result: $list");
}
打印結(jié)果:
Java
3
[Java, Kotlin, Python, Js]
[PHP, Java, Kotlin, Python, Js]
[PHP, Java, Kotlin, Python, Js]
[PHP, Java, Python, Js]
0
3
sort result: [Java, Js, PHP, Python]
subList result: [Java, Js]
asMap result: {0: Java, 1: Js, 2: PHP, 3: Python}
Java
Js
PHP
Python
clear result: []
Map
Map創(chuàng)建
- 創(chuàng)建可變Map: var language = {"first": "Java", "second": "Dart"};
- 創(chuàng)建不可變Map: var language = const {"first": "Java", "second": "Dart"};
- 構(gòu)造創(chuàng)建: var language = new Map();
void main() {
var map1 = {"first": "Dart", 1: true, true: "2"};
print(map1);
print(map1["first"]);
print(map1[true]);
map1[1] = "1";
print(map1);
var map2 = const {1: "Dart", 2: "Java"};
//map2[1] = "Js"; 運(yùn)行時(shí)會(huì)報(bào)錯(cuò) Cannot set value in unmodifiable Map
var map3 = new Map();
map3["first"] = 1;
map3["second"] = 2;
print(map3);
}
打印結(jié)果:
{first: Dart, 1: true, true: 2}
Dart
2
{first: Dart, 1: 1, true: 2}
{first: 1, second: 2}
常用操作
- []
- length
- isEmpty()
- isNotEmpty()
- containsKey() 是否包含某個(gè)鍵
- containsValue() 是否包含某個(gè)值
- keys 鍵的集合
- values 值的集合
- forEach() 遍歷
- remove() 移除指定鍵的元素
void main() {
var map = {"first": "Dart", 1: true, true: "2"};
print(map["first"]);
print(map.length);
print(map.isEmpty);
print(map.isNotEmpty);
print(map.containsKey(1));
print(map.containsValue("2"));
print(map.keys);
print(map.values);
map.forEach(f);
map.remove(true);
print(map);
}
void f(key, value){
print("key = $key, value = $value");
}
打印結(jié)果:
Dart
3
false
true
true
true
(first, 1, true)
(Dart, true, 2)
key = first, value = Dart
key = 1, value = true
key = true, value = 2
{first: Dart, 1: true}
dynamic
使用 dynamic 聲明的變量可以賦值為不同類型的值,List泛型指定為 dynamic 表明數(shù)組的元素可以是不同類型的,如下:
void main() {
dynamic a = 1;
a = 2.0;
a = "3";
a = true;
var list = new List<dynamic>();
list.add(0);
list.add(1.0);
list.add("2");
list.add(true);
}