成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Flutter基礎(chǔ)(三)Dart快速入門

helloworldcoding / 1230人閱讀

摘要:工具可以報(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(整數(shù)列表)或List(任何類型的對(duì)象列表)。

    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)出異常。

4. Dart關(guān)鍵字
關(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
5. 變量

變量聲明使用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。

6.1 Number

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)。

6.2 String

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 = """第一行
第二行""";

6.3 Boolean

Dart是強(qiáng)bool類型檢查,只有true對(duì)象才被認(rèn)為是true。

var name = "張無忌";
if (name) {
  print("明教教主");
}

上面的代碼編譯不能通過,因?yàn)閚ame是一個(gè)字符串,而不是bool類型。

6.4 List

下面是一個(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]);

6.5 Set

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);

6.6 Map

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");
 }

7.1 可選參數(shù)

可選參數(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;
}

7. 2 默認(rèn)參數(shù)值

可以使用 = 來定義可選參數(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");

7.3 main函數(shù)

每個(gè)應(yīng)用都需要有個(gè)頂級(jí)的main() 函數(shù)來作為入口才能執(zhí)行。 main()函數(shù)的返回值為 void 并且有個(gè)可選的 List 參數(shù)。此前我們舉的例子都是在main函數(shù)中運(yùn)行才能得已驗(yàn)證:

void main(){
 void printName(String name) {
  print("name is $name");
 }
 printName("liuwangshu");
}

7.4 匿名函數(shù)

大部分函數(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語句。

8.1 for循環(huán)

標(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);
}

8.2 switch和case

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

相關(guān)文章

  • Flutter基礎(chǔ)(二)Flutter最新開發(fā)環(huán)境搭建和Hello World

    摘要:注釋處的方法是程序的入口,使用了符號(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ù)一...

    tuomao 評(píng)論0 收藏0
  • Flutter是跨平臺(tái)開發(fā)終極之選嗎?Android開發(fā)該如何快速上手Flutter

    摘要:月日,谷歌正式發(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ā)框架之一。 ...

    luckyyulin 評(píng)論0 收藏0
  • Flutter 1.5 發(fā)布,正式成為全平臺(tái) UI 框架!

    摘要:一序在上,團(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...

    focusj 評(píng)論0 收藏0
  • flutter入門實(shí)踐到可開發(fā)

    摘要:繼上一篇關(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的介紹,是仿...

    _DangJin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<