1.【文檔講解】Dart基礎(chǔ)快速入門

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

image

聲明: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。

DartPadDart的一個(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è)Promiseawait運(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


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容