摘要:工具可以報(bào)告兩種問題警告和錯(cuò)誤。警告只是說明代碼可能無法正常工作,但不會(huì)阻止程序執(zhí)行。中的是一組無序的集合。其中來指定異常類型,來捕獲異常對(duì)象。其中代表只導(dǎo)入指定的部分,代表除了指定的部分都導(dǎo)入。
前言本文首發(fā)于微信公眾號(hào)「劉望舒」
Dart是Flutter SDK指定的語言,因此要學(xué)習(xí)Flutter,Dart是必須掌握的。關(guān)于Dart可以寫一本書了,這里用一篇文章來介紹下Dart的精髓,帶你快速入門。和Java語言類似的部分,這篇文章就盡量不再講了。
1. Dart開發(fā)環(huán)境搭建學(xué)習(xí)Dart語法最好需要用一個(gè)編輯器來實(shí)踐,這里推薦使用IntelliJ IDEA。先下載Dart SDK,地址為:www.gekorm.com/dart-window… 打開IntelliJ IDEA,菜單中點(diǎn)擊File-->Settings-->plugins,在plugins的搜索框中搜索Dart并安裝,然后重啟IntelliJ IDEA。 點(diǎn)擊File-->New Project-->Dart,按照下圖配置Dart SDK。
注意要選擇第三個(gè)選項(xiàng)Constole Application,否則會(huì)默認(rèn)創(chuàng)建一個(gè)Web項(xiàng)目。點(diǎn)擊Next然后配置項(xiàng)目的名稱就可以創(chuàng)建項(xiàng)目了。 在項(xiàng)目中的bin/main.dart中加入如下測試代碼:
void main() {
print("Hello World");
}
點(diǎn)擊菜單的Run-->Run"main.dart"或者點(diǎn)擊工具條的運(yùn)行圖標(biāo),就能在控制臺(tái)看到輸出的結(jié)果:
2. Dart概述
Dart是谷歌開發(fā)的計(jì)算機(jī)編程語言,亮相于2011年10月,最新的版本是Dart2。Dart誕生的原因是谷歌的工程師出于對(duì)JavaScript的不滿,誕生的初期也贏得了部分前端開發(fā)者的青睞。但是這時(shí)JavaScript借著NodeJS火了起來,在前端、后端、移動(dòng)端無孔不入,Dart就漸漸被人遺忘了,可見Dart本身是具有很強(qiáng)的實(shí)力的,只是不大走運(yùn)。谷歌并沒有放棄Dart,不遺余力的推廣Dart:谷歌的Angular提供了Dart版本,指定Dart為新系統(tǒng)Fuchsia的官方開發(fā)語言,Dart為移動(dòng)UI框架Flutter的開發(fā)語言,因此Dart又重新回到了人們的視野中。 Dart通常情況下運(yùn)行在DartVM上,但是在特定情況下它也可以編譯成本地代碼運(yùn)行在硬件上,比如Flutter會(huì)將代碼編譯成指定平臺(tái)的本地代碼來提高性能。
3. Dart特性和重要概念Dart的特性主要有以下幾點(diǎn):
執(zhí)行速度快,Dart是AOT(Ahead Of Time)編譯的,可以編譯成快速的、可預(yù)測的本地代碼,這使得Flutter幾乎都可以使用Dart來編寫。也可以采用JIT(Just In Time)編譯。
易于移植,Dart可編譯成ARM和X86代碼,這樣Dart可以在Android、iOS和其他地方運(yùn)行。
容易上手,Dart充分吸收了高級(jí)語言特性,如果你已經(jīng)熟悉C++、C、Java,可以在短短幾天內(nèi)用Dart來開發(fā)。
易于閱讀,Dart使Flutter不需要多帶帶的聲明式布局語言(XML或JSX),或者多帶帶的可視化界面構(gòu)建器,這是因?yàn)镈art的聲明式編程布局易于閱讀。
避免搶占式調(diào)度,Dart可以在沒有鎖的情況下進(jìn)行對(duì)象分配和垃圾回收,和JavaScript一樣,Dart避免了搶占式調(diào)度和共享內(nèi)存,因此不需要鎖。
Dart的重要概念有以下幾點(diǎn):
在Dart中,一切都是對(duì)象,每個(gè)對(duì)象都是一個(gè)類的實(shí)例,所有對(duì)象都繼承自O(shè)bject。
Dart在運(yùn)行前解析所有的代碼,指定數(shù)據(jù)類型和編譯時(shí)常量,可以使代碼運(yùn)行的更快。
與Java不同,Dart不具備關(guān)鍵字public、protected、private。如果一個(gè)標(biāo)識(shí)符以下劃線_開始,那么它和它的庫都是私有的。
Dart支持頂級(jí)的函數(shù)如main(),也支持類或?qū)ο蟮撵o態(tài)和實(shí)例方法,還可以在函數(shù)內(nèi)部創(chuàng)建函數(shù)。
Dart支持頂級(jí)的變量,也支持類或?qū)ο蟮撵o態(tài)變量和實(shí)例變量,實(shí)例變量有時(shí)稱為字段或?qū)傩浴?/p>
Dart支持泛型類型,如List
Dart工具可以報(bào)告兩種問題:警告和錯(cuò)誤。警告只是說明代碼可能無法正常工作,但不會(huì)阻止程序執(zhí)行。錯(cuò)誤可以是編譯時(shí)或運(yùn)行時(shí)的。編譯時(shí)錯(cuò)誤會(huì)阻止代碼執(zhí)行; 運(yùn)行時(shí)錯(cuò)誤會(huì)導(dǎo)致代碼執(zhí)行時(shí)報(bào)出異常。
關(guān)鍵字 | |||
---|---|---|---|
abstract | dynamic | implements | show |
as | else | import | static |
assert | enum | in | super |
async | export | interface | switch |
await | extends | is | sync |
break | external | library | this |
case | factory | factory | factory |
catch | false | new | true |
class | class | null | try |
const | finally | on | typedef |
continue | for | operator | var |
covariant | Function | part | part |
default | get | rethrow | while |
deferred | hide | return | with |
do | if | set | set |
變量聲明使用var關(guān)鍵字,未初始化的變量的初始值為null,即便是數(shù)字類型的變量也是null。
var name = "liuwangshu";
name變量的類型被推斷為String,也可以顯示聲明:
String name = "liuwangshu" ;
如果對(duì)象不限于單一類型,可以指定Object或dynamic類型。
Object name = "liuwangshu" ;
如果定義的變量不會(huì)變化,可以使用final或const來代替var,final變量只能設(shè)置一次。
final name = "liuwangshu"
//name = "zhangwuji" ; //會(huì)報(bào)錯(cuò)
const變量為編譯時(shí)常量,如果const變量在類級(jí)別,可以使用static const。
const pi = 3.1415926;
const area = pi * 60 * 60;
const不僅僅用來定義常量,也可以使用const來創(chuàng)建常量的值。
var foo = const []; final bar = const []; const baz = [];//相當(dāng)于`const []`
6. 基本數(shù)據(jù)類型
Dart的基本數(shù)據(jù)類型包括Number、String、Boolean、List、Set、Map、 Symbol、Runes。
number類型為兩類:
int:整數(shù)值不大于64位,具體取決于平臺(tái)。在Dart VM上,值可以是-2 ^63到2 ^63 - 1,如果編譯為JavaScript,允許值為-2^53 to 2^53 - 1。
double:64-bit (雙精度) 浮點(diǎn)數(shù),符合 IEEE 754 標(biāo)準(zhǔn)。
Dart 字符串是 UTF-16 編碼的字符序列。 可以使用單引號(hào)或者雙引號(hào)來創(chuàng)建字符串:
var s1 = "單引號(hào)適用于字符串文字";
var s2 = "雙引號(hào)同樣有效";
可以在字符串中使用表達(dá)式,用法是: ${expression}。如果表達(dá)式是一個(gè)標(biāo)識(shí)符,可以省略 {}。
var s = "乾坤大挪移";
assert("張無忌的$s" ==
"張無忌的乾坤大挪移");
使用三個(gè)單引號(hào)或者三個(gè)雙引號(hào)可以創(chuàng)建多行字符串對(duì)象:
var s1 = """ 第一行 第二行 """; var s2 = """第一行 第二行""";
Dart是強(qiáng)bool類型檢查,只有true對(duì)象才被認(rèn)為是true。
var name = "張無忌";
if (name) {
print("明教教主");
}
上面的代碼編譯不能通過,因?yàn)閚ame是一個(gè)字符串,而不是bool類型。
下面是一個(gè)List 的示例:
var list = [1, 2, 3];
List的第一個(gè)元素的索引是0,最后一個(gè)元素的索引是 list.length - 1 。
var list = [1, 2, 3, 4, 5, 6];
print(list.length);
print(list[list.length-1]);
Dart中的Set是一組無序的集合。
var hero = ["張無忌", "風(fēng)清揚(yáng)", "張三豐", "獨(dú)孤求敗", "蕭峰"];
要?jiǎng)?chuàng)建一個(gè)空集,可以在{}前面帶有類型參數(shù):
var heros={};
使用add()或addAll()方法將條目添加到現(xiàn)有集中:
var heros = {};
heros.add("石破天");
heros.addAll(hero);
Map是一個(gè)鍵值對(duì)相關(guān)的對(duì)象,鍵和值可以是任何類型的對(duì)象,每個(gè)鍵都是唯一的,而一個(gè)值則可以出現(xiàn)多次。
var player= {
// Keys Values
"20" : "斯諾",
"3": "艾弗森",
"40" : "希爾",
"8" : "麥基",
"55" : "穆托姆博"
};
使用Map構(gòu)造函數(shù)也可以實(shí)現(xiàn)同樣的功能:
var player = new Map();
player["20"] = "斯諾";
player["3"] = "艾弗森";
player["40"] = "希爾";
7. 函數(shù)
Dart是一個(gè)真正面向?qū)ο蟮恼Z言,函數(shù)屬于Function對(duì)象。這意味著,函數(shù)可以賦值給變量,也可以當(dāng)做其他函數(shù)的參數(shù)。
void printName(String name) {
print("name is $name");
}
可選參數(shù)可以是可選位置參數(shù),也可以是可選命名參數(shù),但不能同時(shí)使用。
可選命名參數(shù) 調(diào)用方法的時(shí)候,可以使用 paramName: value 的形式來指定參數(shù)的名稱,這樣就可以根據(jù)paramName得知參數(shù)的含義,提高代碼的可讀性。
coffeeFlavor (sugar :true ,sugar :false );
定義函數(shù)時(shí),使用{param1, param2, …}的形式來指定命名參數(shù):
coffeeFlavor ({bool sugar , bool sugar}) { }
可選位置參數(shù) 把函數(shù)的參數(shù)放到 [] 中就變成可選位置參數(shù)了:
String go(String to, [String who]) {
var result = "go to the $to";
if (who != null) {
result = "$result with $who";
}
return result;
}
可以使用 = 來定義可選參數(shù)的默認(rèn)值, 默認(rèn)值必須是編譯時(shí)常量。 如果沒有提供默認(rèn)值,則默認(rèn)值為 null。
String go(String to, [String who= "liuwangshu"]) {
var result = "go to the $to";
if (who != null) {
result = "$result with $who";
}
return result;
}
String result= go ("beijing");
每個(gè)應(yīng)用都需要有個(gè)頂級(jí)的main() 函數(shù)來作為入口才能執(zhí)行。 main()函數(shù)的返回值為 void 并且有個(gè)可選的 List
void main(){
void printName(String name) {
print("name is $name");
}
printName("liuwangshu");
}
大部分函數(shù)都有名字,例如 main() 或者 printElement()。 可以創(chuàng)建沒有名字的匿名方法,格式如下所示。
([[Type] param1[, …]]) { codeBlock; };
下面的代碼定義了一個(gè)參數(shù)為i(該參數(shù)沒有指定類型)的匿名函數(shù)。 list中的每個(gè)元素都會(huì)調(diào)用這個(gè)函數(shù)打印出來.
var list = ["張無忌", "風(fēng)清揚(yáng)", "張三豐", "獨(dú)孤求敗", "蕭峰"];
list.forEach((i) {
print(list.indexOf(i).toString() + ": " + i);
});
8. 流程控制語句
Dart的流程控制語句如下:
if 和 else
for循環(huán)
while和do- while循環(huán)
break和continue
switch和case
assert
這些語句的大部分都和Java差不多,這里主要講解for循環(huán)和switch語句。
標(biāo)準(zhǔn)的 for 循環(huán):
var message = new StringBuffer("張無忌");
for (var i = 0; i < 3; i++) {
message.write("!");
}
List和Set等實(shí)現(xiàn)了Iterable接口的類還支持for-in形式的遍歷:
var hero = ["張無忌", "風(fēng)清揚(yáng)", "張三豐", "獨(dú)孤求敗", "蕭峰"];
for (var h in hero) {
print(h);
}
Dart中Switch語句通過使用 == 來比較整型、字符串或者編譯時(shí)常量。被比較的對(duì)象必須都是同一個(gè)類的實(shí)例(不能是其子類),并且這個(gè)類不允許覆寫 ==。另外,枚舉類型很適用于在Switch語句使用。
String today="Friday";
switch(today){
case "Monday":
print("星期一");
break;
case "Friday":
print("星期五");
break;
}
9.捕獲異常
捕獲異??梢员苊猱惓@^續(xù)傳遞。
try {
//...
} on OutOfLlamasException {
//...
} on Exception catch (e) {
print("Unknown exception: $e");
} catch (e) {
print("Something really unknown: $e");
}
使用on或者catch來聲明捕獲語句,也可以同時(shí)使用。其中on來指定異常類型,catch來捕獲異常對(duì)象。 確保某些代碼不管有沒有出現(xiàn)異常都會(huì)執(zhí)行,可以使用finally語句來實(shí)現(xiàn)。
try {
//...
} catch(e) {
print("Error: $e");
} finally {
//...
}
10.為類添加新的功能
Dart是一個(gè)面向?qū)ο缶幊陶Z言,支持基于Mixin的繼承機(jī)制。Mixin可以理解為多繼承,在with關(guān)鍵字的后面為一個(gè)或者多個(gè)類。
class Person{
run(){
print("跑");
}
}
class Wushu{
use(){
print("乾坤大挪移");
}
}
class Zhangwuji extends Person with Wushu{
int age;
Zhangwuji(int age){
this.age=age;
}
}
void main() {
var zhangwuji=new Zhangwuji(30);
zhangwuji.run();
zhangwuji.use();
}
通過如上代碼的驗(yàn)證,Zhangwuji類擁有了Person和Wushu這兩個(gè)類的方法。
11.庫的使用使用import來引入一個(gè)庫,對(duì)于Dart語言內(nèi)置的庫,使用dart: scheme。 對(duì)于第三方的庫,可以使用文件系統(tǒng)路徑或者 package: scheme。
import "dart:io";
import "package:mylib/mylib.dart";
import "package:utils/utils.dart";
指定庫前綴 如果導(dǎo)入的兩個(gè)庫具有沖突的名字, 可以使用庫的前綴來進(jìn)行區(qū)分。 例如,如果library1和library2 都有一個(gè)名字為Element的類,可以這樣使用:
import "package:lib1/lib1.dart";
import "package:lib2/lib2.dart" as lib2;
// ...
Element element1 = new Element(); //使用lib1中的Element
lib2.Element element2 = new lib2.Element(); //使用lib2中的Element
導(dǎo)入庫的一部分 如果只使用庫的一部分功能,則可以選擇需要導(dǎo)入的部分內(nèi)容。其中show代表只導(dǎo)入指定的部分,hide代表除了指定的部分都導(dǎo)入。
// 只導(dǎo)入foo
import "package:lib1/lib1.dart" show foo;
// 除了foo,其他部分都導(dǎo)入
import "package:lib2/lib2.dart" hide foo;
延遲加載庫 延遲加載意味著應(yīng)用程序可以在需要的時(shí)候再加載庫,使用延遲加載庫的場景主要有以下幾點(diǎn):
減少APP的初始啟動(dòng)時(shí)間。
執(zhí)行A/B測試,例如嘗試各種算法的不同實(shí)現(xiàn)。
加載很少使用的功能。
要延遲加載一個(gè)庫,需要先使用 eferred as來導(dǎo)入:
import "package:deferred/hello.dart" deferred as hello;
當(dāng)需要使用的時(shí)候,調(diào)用loadLibrary() 函數(shù)來加載庫:
greet() async { await hello.loadLibrary(); hello.printGreeting(); }12.異步支持
Dart庫中包含許多返回Future或Stream對(duì)象的函數(shù)。這些函數(shù)是異步的,它們?cè)诨静僮骱髸?huì)返回,而不等待該操作完成,例如讀取一個(gè)文件,在打開文件后就返回了。 雖然看起來有點(diǎn)像同步代碼,但是async和await的代碼是的確異步的。
await readFile()
要使用await,其方法必須帶有async關(guān)鍵字:
FileOperate() async {
var file= await readFile()
//其他處理
}
13.讓類可調(diào)用
如果Dart中的類實(shí)現(xiàn)了call()函數(shù),那么這個(gè)類可以當(dāng)做方法來調(diào)用。
class JointFunction {
call(String a, String b, String c, String d) => "$a $b $c $d";
}
main() {
var jf = new JointFunction();
var out = jf("放","手","去","做");//1
print("$out");
}
在下面的示例中,JointFunction類定義了一個(gè)call()函數(shù),它接收三個(gè)字符串并拼接它們。這樣在注釋1處就可以調(diào)用JointFunction類了。
14.創(chuàng)建實(shí)例在Java中創(chuàng)建實(shí)例可以用new,在Dart中你可以選擇用new,也可以選擇不用:
Element element = Element();
對(duì)于Android開發(fā)來說用new可能更習(xí)慣一些,可讀性也稍微好點(diǎn),不用new的話顯得更簡潔,至于用不用new就看團(tuán)隊(duì)的要求和個(gè)人的習(xí)慣吧,沒有絕對(duì)的好壞之分。
總結(jié)Dart的知識(shí)點(diǎn)有很多,這里只介紹了一部分我認(rèn)為需要重點(diǎn)掌握的部分,如果想了解更多,可以查看官方文檔,關(guān)于Dart的學(xué)習(xí)可以結(jié)合Flutter邊寫邊學(xué),不要只摳Dart的細(xì)節(jié)。
分享大前端、Android、Java等技術(shù),助力5萬程序員成長進(jìn)階。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/7016.html
摘要:注釋處的方法是程序的入口,使用了符號(hào),這是中單行函數(shù)或方法的簡寫,等價(jià)于如下代碼方法是框架的入口,如果不返回方法,那么執(zhí)行的是一個(gè)控制臺(tái)應(yīng)用。 本文首發(fā)于微信公眾號(hào)「劉望舒」 前言 最近的Google I/O大會(huì)上,F(xiàn)lutter1.5 開始支持移動(dòng)、Web、桌面和嵌入式設(shè)備,從不溫不火的sky一直進(jìn)化到如今熱門的Flutter,F(xiàn)lutter的發(fā)展已經(jīng)超出很多人的想象。我對(duì)跨平臺(tái)技術(shù)一...
摘要:月日,谷歌正式發(fā)布了的。到底能不能成為跨平臺(tái)開發(fā)終極之選是基于前端誕生的,但是對(duì)前端開發(fā)來說,的環(huán)境配置很麻煩,需要原生的平臺(tái)知識(shí),還要擔(dān)心遇上網(wǎng)絡(luò)問題?,F(xiàn)在已經(jīng)不是曾經(jīng)的小眾框架,這兩年里它已經(jīng)逐步成長為主流的跨平臺(tái)開發(fā)框架之一。 ...
摘要:一序在上,團(tuán)隊(duì)宣布推出新的穩(wěn)定版本,這是迄今為止最大的一次版本發(fā)布。伴隨著的發(fā)布,同期也宣布發(fā)布的版本,正式開啟了的全平臺(tái)框架之路。隨著的發(fā)布,正式成為一個(gè)全平臺(tái)的框架。開發(fā)流程目前僅支持。showImg(https://user-gold-cdn.xitu.io/2019/5/9/16a9a8967e736208); showImg(https://user-gold-cdn.xitu.i...
摘要:繼上一篇關(guān)于的介紹,是仿照微信界面,因?yàn)樽鳛榍岸碎_發(fā),有一定的基礎(chǔ),所有寫起來,也不是很吃力。班門弄斧之作,若有大神見到,敬請(qǐng)指教,有不對(duì)不合理之處,敬請(qǐng)指出我是邇伶貳環(huán)境準(zhǔn)備以系統(tǒng)為例。 flutter的入門記錄 0.前言: flutter 的入門demo 已經(jīng)寫好一個(gè)星期了,只不過一直都沒有整理出博客來。收拾好心情,來整理一下。繼上一篇關(guān)于react-native-wx的介紹,是仿...
閱讀 1389·2021-10-14 09:43
閱讀 4243·2021-09-27 13:57
閱讀 4573·2021-09-22 15:54
閱讀 2568·2021-09-22 10:54
閱讀 2385·2021-09-22 10:02
閱讀 2121·2021-08-27 13:11
閱讀 877·2019-08-29 18:44
閱讀 1650·2019-08-29 15:20