Flutter學(xué)習(xí)之Dart語言了解

前言

最近準(zhǔn)備著手學(xué)習(xí)一下flutter,首先就要了解它所使用的開發(fā)語言 --- Dart


語言介紹

Dart所有的東西都是對(duì)象,所有的對(duì)象都繼承自O(shè)bject類.
Dart 是一門使用類和單繼承的面向?qū)ο笳Z言,所有的對(duì)象都是類的實(shí)例,并且所有的類都是Object類的子類,一個(gè)類通常由屬性和方法組成


語言類型

在 Dart 里是強(qiáng)類型的蚁鳖,也有自動(dòng)推斷類型的機(jī)制。
在 Dart 里定義變量使用有 var喷好、const耳高、dynamic委粉、Object、類型等方式。對(duì)于函數(shù)而言貌虾,并不需要寫 function 關(guān)鍵字胜臊,而讓它有函數(shù)應(yīng)有的外形即可勺卢。

// 基本類型
var name = 'Voyager I';
var antennaDiameter = 3.7;
const image = {
    'tags': ['Jupiter', 'Saturn', 'Uranus', 'Neptune'],
    'url': '//path/to/saturn.jpg'
};

// 函數(shù)類型
String sayHello(var name) {
    return 'Hello $name!';
}

// 箭頭函數(shù)
var add = (a, b) => a + b;

// 類似 Promise
Future sum(num a, num b) async {
    return await add(a, b);
}

// main 函數(shù)
void main() async {
    print(sayHello(name));               // Hello Voyager I!
    print(max(1, 2));                    // 2
    sum(1, 2).then((res) => print(res)); // 3 (類似 Promise)
}

Object name1 = "小明";
dynamic name2 = "老王";

dynamic 是任意的意思,它與 var 不同象对,var 會(huì)自動(dòng)推斷類型從而得出一個(gè)確定類型黑忱,而 dynamic 可以表示任意,相對(duì)于 Typescript 中的 any。
Dart 在聲明時(shí)有以下幾個(gè)基本類型:number甫煞、string菇曲、boolean、list抚吠、map常潮、rune、symbol

函數(shù)

Dart 的函數(shù)支持函數(shù)聲明楷力、函數(shù)字面量喊式、箭頭函數(shù)、函數(shù)表達(dá)式萧朝、匿名函數(shù)岔留。

int add(int a, int b) {
    return a + b;
}

// 類型可省略
add(a, b) {
    return a + b;
}

// 箭頭函數(shù)
var add = (a, b) => a + b;
int add(int a, int b) => a + b;

// 可選參數(shù),使用 [] 限定
int add(int a, int b, [int c = 1, int d = 2]) => a + b + c + d;

// 顯示指定參數(shù)名稱检柬,默認(rèn)參數(shù)
int add({ int a = 1, int b = 2 }) {
    return a + b;
}
add(a: 1, b: 2);

// 回調(diào)函數(shù)
var list = ['apples', 'bananas', 'oranges'];
list.forEach((item) {
    print('${list.indexOf(item)}: $item');
});

// 回調(diào) + 箭頭
list.forEach((item) => print(item));

// 閉包
Function makeAdder(int addBy) {
    return (int i) => addBy + i;
}

操作符

操作符包括了:expr++献联、expr--、()厕吉、[]酱固、.、?头朱、等运悲,基本和 ES6 一致,除了沒有 === 的判斷项钮。

例外有三個(gè)特色的操作:is班眯、as、is?烁巫。

is 用于判斷類型署隘,as 用于續(xù)言、is? 與 is 相反(相等 ,不相等)亚隙。

if (emp is Person) {
    // Type check
    emp.firstName = 'Bob';
}

(emp as Person).firstName = 'Bob';

級(jí)聯(lián)符號(hào)(..):允許您在同一個(gè)對(duì)象上進(jìn)行一系列操作磁餐。除了函數(shù)調(diào)用之外,還可以訪問同一對(duì)象上的字段阿弃。這通常會(huì)為您節(jié)省創(chuàng)建臨時(shí)變量的步驟诊霹,并允許您編寫更流暢的代碼。

var gifts = {
    'first': 'partridge',
    'second': 'turtledoves',
    'fifth': 'golden rings'
};

getGifts() {
    return gifts;
}

// 不使用級(jí)聯(lián)符號(hào)
var g = getGifts();
g.first = 1;
g.second = 2;
g.fifth = 3;
// 使用級(jí)聯(lián)符號(hào)
getGifts()
    ..first = 1
    ..second = 2
    ..fifth = 3;

控制流程

Dart 的控制流程支持:if渣淳、if-else脾还、for、while入愧、do-while鄙漏、switch嗤谚、try-catch-finally

if (isRaining()) {
    // ...
} else if (isSnowing()) {
    // ...
} else {
    // ...
}

var message = new StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
    message.write('!');
}

var collection = [0, 1, 2];
for (var x in collection) {
    print(x); // 0 1 2
}

類結(jié)構(gòu)

Dart 的類支持繼承、靜態(tài)方法怔蚌、接口巩步、構(gòu)造函數(shù)、重載操作符媚创、抽象類渗钉、接口類、 mixins等钞钙。
Dart 的類不支持什么 public鳄橘、private ,protected這些訪問修飾符,可以使用_把一個(gè)屬性或者方法定義為私有(注意:需要把這個(gè)類抽離成一個(gè)文件,才生效)。_method 下劃線*代表私有方法芒炼。

模塊

Dart 的模塊導(dǎo)入瘫怜。

// 全部導(dǎo)入,并且是全局變量
import 'dart:math';
max(1, 2);

// 別名
import 'dart:math' as math;
math.max(1, 2);

// 只導(dǎo)入部分
import 'dart:math' show min;
min(1, 2);

// 懶加載本刽,類似 ES6 的 import()
import 'dart:math' deferred as math;
Future greet() async {
    await math.max(1, 2);
}

異步編程

在 ES6 與異步相關(guān)的就是 Promise鲸湃、async、await子寓。而在 Dart 則是 Future暗挑、async、await斜友。

Dart庫充滿了返回 Future 或 Stream 對(duì)象的函數(shù)炸裆。這些功能是異步的:它們?cè)谠O(shè)置可能耗時(shí)的操作(例如 I/O)之后返回,而不等待該操作完成鲜屏。 在 async 和 await 關(guān)鍵字支持異步編程烹看,讓你寫異步代碼看起來類似于同步代碼。

使用 async/await 之前需要引入 dart:async 模塊洛史。

Future<String> lookUpVersion() async => '1.0.0';

Future main() async {
    await for (var request in requestServer) {
        handleRequest(request);
    }
}

也支持 then惯殊,catchError 等。

    final url = 'https://httpbin.org/ip';
    HttpRequest.request(url).then((value) {
        print(json.decode(value.responseText)['origin']);
    }).catchError((error) => print(error));
}

// 也可以這樣寫
Future<String> getIPAddress() async {
    final url = 'https://httpbin.org/ip';
    var request = await HttpRequest.request(url);
    String ip = json.decode(request.responseText)['origin'];
    return ip;
}

類似 setTimeout 的操作也殖。

await new Future.delayed(const Duration(milliseconds: 2000));

// 或者
new Future.delayed(const Duration(milliseconds: 2000)).then(() {
    // ...
});

JSON處理

json 在 JavaScript 里是一個(gè)非常有優(yōu)勢(shì)的處理土思,因?yàn)?json 本身延至于 JavaScript。
在 Dart 里處理 json 有兩個(gè) API 可用:encode(序列化) 和 decode(反序列化)忆嗜。

// 把對(duì)象轉(zhuǎn)為 json 字符串
var jsonstr = json.encode([1, 2, { "a": null }]);

// 把 json 字符串轉(zhuǎn)為對(duì)象
var decoded = json.decode('["foo", { "bar": 499 }]');
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末己儒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子霎褐,更是在濱河造成了極大的恐慌,老刑警劉巖该镣,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冻璃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡省艳,警方通過查閱死者的電腦和手機(jī)娘纷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跋炕,“玉大人赖晶,你說我怎么就攤上這事》茫” “怎么了遏插?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纠修。 經(jīng)常有香客問我胳嘲,道長,這世上最難降的妖魔是什么扣草? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任了牛,我火速辦了婚禮,結(jié)果婚禮上辰妙,老公的妹妹穿的比我還像新娘鹰祸。我一直安慰自己,他們只是感情好密浑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布蛙婴。 她就那樣靜靜地躺著,像睡著了一般肴掷。 火紅的嫁衣襯著肌膚如雪敬锐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天呆瞻,我揣著相機(jī)與錄音台夺,去河邊找鬼。 笑死痴脾,一個(gè)胖子當(dāng)著我的面吹牛颤介,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赞赖,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼滚朵,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了前域?” 一聲冷哼從身側(cè)響起辕近,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匿垄,沒想到半個(gè)月后移宅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體归粉,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年漏峰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了糠悼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浅乔,死狀恐怖倔喂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情靖苇,我是刑警寧澤席噩,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站顾复,受9級(jí)特大地震影響班挖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芯砸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一萧芙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧假丧,春花似錦双揪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渴邦,卻和暖如春疯趟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谋梭。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國打工信峻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瓮床。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓盹舞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親隘庄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子踢步,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容