3-2 【文檔講解】Dart基礎(chǔ)快速入門
聲明:Flutter專欄文檔均來自慕課網(wǎng)
https://coding.imooc.com/class/321.html
Dart基礎(chǔ)知識(shí)
程序入口
控制臺(tái)輸出
變量
檢查null或零
Functions
異步編程
Futures
async 和 await
在本節(jié)中我們主要對標(biāo)JavaScript來講解Dart與JavaScript的異同粉洼,對JavaScript還不熟悉的小伙伴可以省略JavaScript部分,直接學(xué)習(xí)Flutter部分叶摄。
程序入口
JavaScript沒有預(yù)定義的入口函數(shù)属韧,但在Dart中,每個(gè)app都必須有一個(gè)頂級(jí)的main()
函數(shù)作為應(yīng)用程序的入口點(diǎn)蛤吓。
// Dart
main() {
}
練一練DartPad宵喂。
DartPad是Dart的一個(gè)線上playground,提供Dart線上playground還有:Online Dart Compiler柱衔。
控制臺(tái)輸出
要在Dart中打印到控制臺(tái)樊破,可使用print
:
// JavaScript
console.log("Hello world!");
// Dart
print('Hello world!');
練一練DartPad。
變量
Dart是類型安全的** - 它使用靜態(tài)類型檢查和運(yùn)行時(shí)的組合,檢查以確保變量的值始終與變量的靜態(tài)值匹配 類型唆铐。盡管類型是必需的哲戚,但某些類型注釋是可選的,因?yàn)?/strong> Dart**會(huì)執(zhí)行類型推斷艾岂。
創(chuàng)建和分配變量
在JavaScript中顺少,無法定義變量類型。
在Dart中, 變量必須是明確的類型或系統(tǒng)能夠解析的類型王浴。
// JavaScript
var name = "JavaScript";
// Dart
String name = 'dart'; // Explicitly typed as a string.
var otherName = 'Dart'; // Inferred string.
// Both are acceptable in Dart.
練一練DartPad脆炎。
有關(guān)更多信息,可參考Dart's Type System。
默認(rèn)值
在JavaScript中氓辣,未初始化的變量是undefined
秒裕。
在Dart中,未初始化的變量的初始值為null
钞啸。
注意:數(shù)字在Dart中也被當(dāng)成對象几蜻,所以只要是帶有數(shù)字類型的未初始化變量的值都是“null”喇潘。
// JavaScript
var name; // == undefined
// Dart
var name; // == null
int x; // == null
嘗試一下DartPad。
有關(guān)更多信息,** 可參考Dart**官網(wǎng)關(guān)于變量的介紹梭稚。
檢查null或零
在JavaScript中颖低,1或任何非null對象的值被視為true。
// JavaScript
var myNull = null;
if (!myNull) {
console.log("null is treated as false");
}
var zero = 0;
if (!zero) {
console.log("0 is treated as false");
}
在Dart中弧烤,只有布爾值“true”被視為true忱屑。
// Dart
var myNull = null;
if (myNull == null) {
print('use "== null" to check null');
}
var zero = 0;
if (zero == 0) {
print('use "== 0" to check zero');
}
練一練DartPad。
前方高能
Dart null檢查最佳實(shí)踐
從Dart 1.12開始暇昂,null-aware運(yùn)算符可用幫助我們做null檢查:
bool isConnected(a, b) {
bool outConn = outgoing[a]?.contains(b) ?? false;
bool inConn = incoming[a]?.contains(b) ?? false;
return outConn || inConn;
}
?.
運(yùn)算符在左邊為null的情況下會(huì)阻斷右邊的調(diào)用莺戒,??
運(yùn)算符主要作用是在左側(cè)表達(dá)式為 null 時(shí)為其設(shè)置默認(rèn)值。
對于表達(dá)式:
outgoing[a]?.contains(b)
如果outgoing為null或outgoing[a]為null或contains(b)的值為null话浇,都會(huì)導(dǎo)致表達(dá)式為null脏毯。
大家看一下下面預(yù)計(jì)的執(zhí)行結(jié)果:
print(null ?? false);
print(false ?? 11);
print(true ?? false);
技巧:獲取一個(gè)對象中數(shù)組的長度:
searchModel?.data?.length ?? 0
。
Functions
Dart和JavaScript函數(shù)類似幔崖。主要區(qū)別是聲明:
// JavaScript ES5
function fn() {
return true;
}
// Dart
fn() {
return true;
}
// can also be written as
bool fn() {
return true;
}
練一練DartPad食店。
關(guān)于functions的更多內(nèi)容可參考dart官方文檔functions。
異步編程
Futures
與JavaScript一樣赏寇,Dart支持單線程執(zhí)行吉嫩。在JavaScript中,Promise對象表示異步操作的最終完成(或失斝岫ā)及其結(jié)果值自娩,Dart使用 Future 來表示異步操作:
// JavaScript
_getIPAddress = () => {
const url="https://httpbin.org/ip";
return fetch(url)
.then(response => response.json())
.then(responseJson => {
console.log(responseJson.origin);
})
.catch(error => {
console.error(error);
});
};
// Dart
_getIPAddress() {
final url = 'https://httpbin.org/ip';
HttpRequest.request(url).then((value) {
print(json.decode(value.responseText)['origin']);
}).catchError((error) => print(error));
}
練一練:DartPad。
關(guān)于Futures的更多內(nèi)容可參考dart官方文檔Futures渠退。
async 和await
async
函數(shù)聲明定義了一個(gè)異步函數(shù)忙迁。
在JavaScript中,async
函數(shù)返回一個(gè)Promise
碎乃。await
運(yùn)算符是用來等待Promise
:
// JavaScript
async _getIPAddress() {
const url="https://httpbin.org/ip";
const response = await fetch(url);
const json = await response.json();
const data = await json.origin;
console.log(data);
}
在Dart中姊扔,async
函數(shù)返回一個(gè)Future
,函數(shù)的主體是稍后執(zhí)行梅誓。await
運(yùn)算符用于等待Future
:
// Dart
_getIPAddress() async {
final url = 'https://httpbin.org/ip';
var request = await HttpRequest.request(url);
String ip = json.decode(request.responseText)['origin'];
print(ip);
}
練一練DartPad恰梢。
關(guān)于Futures的更多內(nèi)容可參考dart官方文檔async and await。
關(guān)于創(chuàng)建Dart的更多實(shí)戰(zhàn)技巧與最佳實(shí)踐可學(xué)習(xí)《基于Flutter1.x開發(fā)攜程網(wǎng)App》梗掰。