變量
/**
* Dart中用var生命變量,可以賦值不同類型
* Type:dynamic
* 一開始沒有初始值的變量可以賦值任意類型,一開始有初始值的變量,只能賦值同類型
* */
var a;
a = "asd";
print(a);
a = 6;
print(a);
a = [1,2];
print(a);
var b = 66;
print(b);
final變量
/**
* final:使用final聲明的只能賦值一次的變量
* 可以在命名時賦值,也可以命名不賦值,其他地方賦值,但是只能賦值一次!
* 沒有被賦值過的final變量是不能被使用的
* 它是最終變量
* */
final c;
c = 2;
print("c : $c");
常量
/**
* const:常量只能在聲明的時候賦值,而且必須在聲明時賦值
* */
const d = 5;
print("d : $d");
Dart的數(shù)據(jù)類型
- 數(shù)值型Number: int & double
- 字符串
- bool
- 列表 - List
- 鍵值對(字典) - Map
/**
* num:可以是int也可以是double
* */
num a = 10;
a = 1.5;
int b = 20;
print(b.isEven); // 偶數(shù)
print(b.isOdd); // 奇數(shù)
double c = 30.0;
// 算數(shù)運算符 + - * / %(取模) ~/(取整)
print(a ~/ b); // 相當(dāng)于a/b取整
// 類型轉(zhuǎn)換
print(a.toInt().isOdd);
print(b.toDouble());
/**
* Dart中的字符串
* 使用單引號和雙引號創(chuàng)建
* 三個引號或雙引號可以創(chuàng)建多行字符串
* */
var a = 'James';
var b = "Rose";
print(a+b);
String str = "Hello";
String str1 = "World";
/**
* Apple
Orange
Banana
Cherry
* 結(jié)果和下面寫的一樣,前面會帶空格
* */
String str2 = '''Apple
Orange
Banana
Cherry''';
print(str2);
/**
* 取字符串第n個字符
* e
* */
print(str[1]);
/**
* 字符串拼接
* HelloWorld
* */
print(str+str1);
/**
* 字符串重復(fù)翻倍
* HelloHelloHelloHelloHello
* */
print(str * 5);
/**
* 格式化字符串
* 表達式需要花括號括起來,單個變量直接美元符加變量
* */
int aa = 10;
int bb = 20;
int cc = aa + bb;
print("a + b = ${aa + bb}");
print("a + b = $cc");
/**
* 如果不需要字符串中的轉(zhuǎn)義字符,字符串前面加r
* apple
orange
* apple\norange
* */
String str3 = "apple\norange";
String str4 = r"apple\norange";
print(str3);
print(str4);
/**
* 字符串長度
* */
print(str3.length);
/**
* Dart中的列表,可以存放不同的數(shù)據(jù)類型
* 創(chuàng)建可變list var list = [1, 2, 3];
* 創(chuàng)建不可變list var list = const [1, 2, 3];
* */
var list1 = [1, 2, 3, 'sj'];
print(list1);
print(list1[3]);
list1[3] = 4;
print(list1[3]);
var list2 = const [1, 2];
/**
* 獲取數(shù)組長度
* */
var list3 = ["red", 1];
print(list3.length);
/**
* 添加元素
* 如果數(shù)組原來是同類型數(shù)據(jù),添加只能是同類型數(shù)據(jù)
* 如果原來有不同類型數(shù)據(jù),可隨便添加什么類型
* */
list3.add([1]);
print(list3);
/**
* 插入元素
* 插入元素類型規(guī)則同添加元素
* */
list3.insert(1, "yello");
print(list3);
/**
* 刪除元素
* */
list3.remove("red");
print(list3);
list3.removeAt(1);
print(list3);
list3.clear();
print(list3);
/**
* 數(shù)組排序
* */
var list4 = [5, 3, 2, 7, 9, 1];
list4.sort();
print(list4);
/**
* 數(shù)組截取
* */
print(list4.sublist(2, 4));
/**
* Dart中的map,鍵值對
* 創(chuàng)建可變的Map: var json = {'one' : 'red', 'two' : 'green'};
* 創(chuàng)建不可變的Map: var json = const {'one' : 'red', 'two' : 'green'};
* */
var json1 = {'one' : 1, 2 : 'green'};
print(json1);
print(json1[2]);
json1['three'] = 'yello';
print(json1);
/**
* Map的長度
* 所有的key
* 所有的value
* */
print(json1.length);
print(json1.keys);
print(json1.values);
/**
* 數(shù)組可以直接簡單轉(zhuǎn)Map
* */
var list = ['red', 'green', 'blue'];
print(list.asMap());
Dart的運算符
- 賦值運算 ??=
- 條件表達式 ??
/**
* ??=
* 如果a=nil 把a賦值
* 如果a不為nil,則不賦值
* nil不是0,a=0后續(xù)也不賦值
* */
var a;
a ??= 10;
print(a);
a ??= 5;
print(a);
/**
* ??
* 如果a為nil,結(jié)果為b
* 如果a不為nil,結(jié)果為a
* */
var b = 6;
print(a ?? b);
Dart的方法
- Dart中的方法也是對象
- 方法的返回值和參數(shù)可以省略
- 當(dāng)方法的執(zhí)行語句只有一句的時候,可以使用箭頭函數(shù) => 表達式
- 可選參數(shù):傳遞參數(shù)的時候必須帶上形參的名字,可選參數(shù)的順序隨便
void function() => print(5);
int sum(int a, int b) {
return a + b;
}
// 可以寫成下面方法,但是不建議這么寫
sum1(a, b) {
return a + b;
}
// 箭頭函數(shù)是return,可以省去return
int sum2(int a, int b) => a + b;
/// 可選參數(shù)不能直接寫int,因為報錯,int不能為null。
/// 可以使用可選類型int?
/// 可選參數(shù)可以傳1個,2個,3個....隨便幾個都可以且前后位置隨意
sum3(int a, {int? b, var c}) {
b ??= 0;
c ??= 0;
return a + b + c;
}
/// 可選參數(shù)可以設(shè)置默認(rèn)值
sum4(int a, {int b = 5, int c = 0}) {
return a + b + c;
}
/// 按順序的可選參數(shù)
/// 可選參數(shù)必須按順序,按位置
sum5(int a, [int b = 5, int c = 0]) {
return a + b + c;
}
- 函數(shù)作為參數(shù)傳遞
void main() {
var hello = printHello;
hello();
var list = [1, 2, 3, 4];
// list.forEach(print);
forEachDemo(list, printElement);
}
int index = 0;
printElement(var a) {
print('元素$index : $a');
index++;
}
forEachDemo(List list, void func(var element)) {
for (var e in list) func(e);
}
- 匿名方法:沒有方法名的方法
var func = () {
print('這是一個匿名方法');
};
func();
/// 立即執(zhí)行方法、函數(shù)
() {
print('這是個立即執(zhí)行方法');
}();
/// 匿名方法作為參數(shù)
var i = 0;
forEachDemo(list, (var a) {
print('元素$i : $a');
i++;
});
- 閉包 closure
定義在函數(shù)里面的函數(shù)就是閉包,閉包也是對象。
閉包的作用:可以訪問外部函數(shù)的局部變量。
void closureDemo() {
var fun = funA();
fun();
fun();
fun();
fun();
}
funA() {
var count = 0;
return () => print(count++); // 這個匿名函數(shù)就是一個閉包
}