3-2 【文檔講解】Dart基礎(chǔ)快速入門

聲明:Flutter專欄文檔均來(lái)自慕課網(wǎng)
https://coding.imooc.com/class/321.html
Dart基礎(chǔ)知識(shí)
程序入口
控制臺(tái)輸出
變量
檢查null或零
Functions
異步編程
Futures
async 和 await
在本節(jié)中我們主要對(duì)標(biāo)JavaScript來(lái)講解Dart與JavaScript的異同,對(duì)JavaScript還不熟悉的小伙伴可以省略JavaScript部分,直接學(xué)習(xí)Flutter部分。
程序入口
JavaScript沒(méi)有預(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中,無(wú)法定義變量類型。
在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)成對(duì)象,所以只要是帶有數(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對(duì)象的值被視為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開(kāi)始,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)值。
對(duì)于表達(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è)對(duì)象中數(shù)組的長(zhǎng)度:
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對(duì)象表示異步操作的最終完成(或失?。┘捌浣Y(jié)果值,Dart使用 Future 來(lái)表示異步操作:
// 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)算符是用來(lái)等待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開(kāi)發(fā)攜程網(wǎng)App》。