變量
創(chuàng)建一個(gè)變量并進(jìn)行初始化:
var name = 'Bob';//此時(shí)這里的變量是 name 存儲(chǔ)了一個(gè) String 類型的對(duì)象引用
name
變量的類型被推斷為 String
洪唐。 但是也可以通過指定類型的方式,來改變變量類型喊括。 如果對(duì)象不限定為單個(gè)類型祟峦,可以指定為 對(duì)象類型
或 動(dòng)態(tài)類型
:
dynamic name = 'Bob';// 動(dòng)態(tài)類型 運(yùn)行時(shí)推斷類型
var name = 'Bob';// 自動(dòng)推斷
String name = 'Bob';// 顯式聲明
默認(rèn)值
未初始化的變量默認(rèn)值是 null
苍日。即使變量是數(shù)字 類型默認(rèn)值也是 null相恃,因?yàn)樵?Dart 中一切都是對(duì)象耕腾,數(shù)字類型 也不例外。
常量
使用過程中從來不會(huì)被修改的變量, 可以使用 final
或 const
, 而不是 var
或者其他類型疗琉, Final 變量的值只能被設(shè)置一次盈简; Const 變量在編譯時(shí)就已經(jīng)固定 (Const 變量 是隱式 Final 的類型.) 最高級(jí) final 變量或類變量在第一次使用時(shí)被初始化香浩。
final
創(chuàng)建和設(shè)置一個(gè) Final 變量:
final name = 'Bob'; // Without a type annotation
final String nickname = 'Bobby';
name = 'Alice'; // Error: 一個(gè) final 變量只能被設(shè)置一次。
const
如果需要在編譯時(shí)就固定變量的值,可以使用 const
類型變量速缆。 如果 Const 變量是類級(jí)別的幢尚,需要標(biāo)記為 static const
真慢。 在這些地方可以使用在編譯時(shí)就已經(jīng)固定不變的值,字面量的數(shù)字和字符串朗鸠, 固定的變量,或者是用于計(jì)算的固定數(shù)字:
const bar = 1000000; // 壓力單位 (dynes/cm2)
const double atm = 1.01325 * bar; // 標(biāo)準(zhǔn)氣壓
//Const 關(guān)鍵字不僅可以用于聲明常量變量。 還可以用來創(chuàng)建常量值,以及聲明創(chuàng)建常量值的構(gòu)造函數(shù)沼沈。 任何變量都可以擁有常量值。
var foo = const [];
final bar = const [];
const baz = []; // Equivalent to `const []`
foo = [1, 2, 3]; // 曾經(jīng)引用過 const [] 常量值页衙。
baz = [42]; // Error: 常量變量不能賦值修改呻袭。
函數(shù)
一般函數(shù)
bool isNoble(int atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
//如果函數(shù)中只有一句表達(dá)式,可以使用簡寫語法
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
可選參數(shù)
函數(shù)方法的可選參數(shù)通過在參數(shù)列表中用 {} 指定段誊,例如:
void say(String name, {String word = 'hello'}){
print('$name say $word');
}
// 通過(可選參數(shù)名 + :)進(jìn)行可選參數(shù)的賦值
main(){
say('kuky', word: 'Hello World'); // kuky say Hello World
}
參數(shù)默認(rèn)值
認(rèn)值只能是編譯時(shí)常量烟瞧。 如果沒有提供默認(rèn)值强岸,則默認(rèn)值為 null。
/// 設(shè)置 [bold] 和 [hidden] 標(biāo)志 ...
void enableFlags({bool bold = false, bool hidden = false}) {...}
// bold 值為 true; hidden 值為 false.
enableFlags(bold: true);
可變參數(shù)
將參數(shù)放到 []
中來標(biāo)記參數(shù)是可變的:
String say(String from, String msg, [String device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
assert(say('Bob', 'Howdy') == 'Bob says Howdy');
assert(say('Bob', 'Howdy', 'smoke signal') ==
'Bob says Howdy with a smoke signal');
Main() 函數(shù)
main()
函數(shù)是應(yīng)用的的頂級(jí)函數(shù)弹沽,作為應(yīng)用服務(wù)的入口策橘。 main()
函數(shù)返回值為空炸渡,參數(shù)為一個(gè)可選的 List
void main() {
//入口
}
函數(shù)也是對(duì)象
一個(gè)函數(shù)可以作為另一個(gè)函數(shù)的參數(shù)。 例如:
void printElement(int element) {
print(element);
}
var list = [1, 2, 3];
// 將 printElement 函數(shù)作為參數(shù)傳遞丽已。
list.forEach(printElement);
也可以將一個(gè)函數(shù)值賦值給一個(gè)變量:
var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
assert(loudify('hello') == '!!! HELLO !!!');
匿名函數(shù)
創(chuàng)建沒有名字的函數(shù)蚌堵,這種函數(shù)被稱為 匿名函數(shù), 有時(shí)候也被稱為 lambda 或者 closure 沛婴。 匿名函數(shù)可以賦值到一個(gè)變量中吼畏, 舉個(gè)例子,在一個(gè)集合中可以添加或者刪除一個(gè)匿名函數(shù)瘸味。
匿名函數(shù)和命名函數(shù)看起來類似— 在括號(hào)之間可以定義一些參數(shù)或可選參數(shù)宫仗,參數(shù)使用逗號(hào)分割。
var list = ['apples', 'bananas', 'oranges'];
list.forEach((item) {
print('${list.indexOf(item)}: $item');
});
//如果函數(shù)只有一條語句旁仿, 可以使用箭頭簡寫藕夫。
list.forEach(
(item) => print('${list.indexOf(item)}: $item'));
作用域
Dart 支持多個(gè)嵌套函數(shù)的變量作用域:
bool topLevel = true;
void main() {
var insideMain = true;
void myFunction() {
var insideFunction = true;
void nestedFunction() {
var insideNestedFunction = true;
assert(topLevel);
assert(insideMain);
assert(insideFunction);
assert(insideNestedFunction);
}
}
}
注意 nestedFunction()
可以訪問所有的變量, 一直到頂級(jí)作用域變量
閉包
閉包 即一個(gè)函數(shù)對(duì)象枯冈,即使函數(shù)對(duì)象的調(diào)用在它原始作用域之外毅贮, 依然能夠訪問在它詞法作用域內(nèi)的變量。
/// 返回一個(gè)函數(shù)尘奏,返回的函數(shù)參數(shù)與 [addBy] 相加滩褥。
Function makeAdder(num addBy) {
return (num i) => addBy + i;
}
void main() {
// 創(chuàng)建一個(gè)加 2 的函數(shù)。
var add2 = makeAdder(2);
// 創(chuàng)建一個(gè)加 4 的函數(shù)炫加。
var add4 = makeAdder(4);
assert(add2(3) == 5);
assert(add4(3) == 7);
}