碼個蛋 · 程式 ·

Flutter 入門指北之 Dart

前言最近Flutter真心火爆到不要不要的,隨大流,學一波

作者:Kuky_xs

原文:https://www.jianshu.com/p/8ddb16902ce6

前言

最近 Flutter 真心火爆到不要不要的,隨大流,學一波,在這之前,對於語言的語法還是需要有些必要的了解的,Dart 這門語言,說實話對於會 Java 這類面向對象的語言的小夥伴們來說,真的灰常灰常簡單,這邊我總結了一些 Dart 和 Java 的一些語法差異,當然,只是部分,但是,按照我目前的學習進度來說,了解了這些對於寫 Flutter 項目絕對夠了。小夥伴也可以自己查看,我這邊提供一個自己學習的網址 Dart 快速入門:http://dart.goodev.org/guides/language

溫馨提示:本篇文章沒有圖,沒有圖,沒有圖,可能會造成部分不適,請注意,請注意,請注意,系好安全帶,我們要「開車了」......

1.Variables

Dart 變量類型可以通過具體的賦值進行推導,例如:var name = 'kuky' 則定義了一個 String 類型對象 name,也可以通過指定具體的類型 String name = 'kuky',如果沒有初始化變量,則默認值為 ,類型為數字的變量默認值同為 (同 java 不同,java 中 int 默認為 0.)如果需要定義常量,可以通過 final 和 const 進行定義,final 變量只能賦值一次,const 是編譯時常量。

2. Build-in-types

Dart 內置類型包括 :

  • Numbers 包括 int[-2^53 ~ 2^53], double[64-bit 浮點數]

  • Strings Dart 字符串是 UTF-16 編碼的字符序列, 可以使用單引號或者雙引號來創建字符串。


  • 通過 == 判斷兩個字符串是否相同


  • 通過三對單引號'''aaa'''或者雙引號"""aaa"""可以創建多行字符串對象


  • 使用前綴 r 創建 raw string,字符串內不會進行轉義,例如:var a = r'haha \n breakLine' 列印 a 對象則會按照輸入的輸出,不會進行換行


  • Booleans Dart 中,只有 true 對象才被認為是 true, 所有其他的值都是 false


  • Lists 列表,例如:var list = [1, 2, 3, 4]

  • 通過 const 關鍵詞可以定義一個不可變列表 var list = const [1, 2, 3, 4]

  • 參數化定義var name = <String>['Jone', 'Jack']


  • Maps 鍵值對,例如:var map = {'one': 1, 'two': 2}

  • 如果鍵值對需要添加新的鍵值對,直接指定即可,map['three'] = 3,若查找的鍵不存在,返回

  • 參數化定義 var map = <String, int>{'one': 1, 'two': 2}


  • Runes 代表字符串的 UTF-32 code points,通常使用 \uXXXX 的方式來表示 Unicode code point, XXXX 是4個 16 進位的數,例如 \u2665 返回心形符號


  • Symbols 代表 Dart 程序中聲明的操作符或者標識符,幾乎不使用


3. Function

函數方法的可選參數通過在參數列表中用 {} 指定,例如:

void say(String name, {String word = 'hello'}){ print('$name say $word'); }
// 通過(可選參數名 + :)進行可選參數的賦值main{ say('kuky', word: 'Hello World'); // kuky say Hello World}

word 參數為可選參數,默認值為 hello

4. Operators

操作符幾乎和別的語言類似,提個比較特殊的賦值操作符 ??= 和 ?.操作符

var a = 1;var b ?? = a; // 如果 b 的值是 則將 a 賦值給 b,否則保持不變var c = size?.x; // 如果 size 為 則返回 ,否則返回 size.a 的值

5. Conditional Expressions

Dart 可以通過兩個特殊的操作符替換 if{} else{} 表達式

/// condition? expr1: expr2 同 java 三目運算符var a = if(a < 0) -a : a/// expr1 ?? expr2 String toString => msg ?? super.toString // 如果 expr1 不為 則返回 expr1 否則返回 expr2

6. Cascade Notaion(..)

級聯操作符 (..) 可以在同一個對象上 連續調用多個函數以及訪問成員變量

class Size{ double x; double y;
@override String toString { return 'Size{x: $x, y: $y}'; }}
var size = Size;/// 通過級聯操作符進行賦值,可以更加簡潔,!!如果函數返回值為 void 則不能進行級聯!!print(size ..x = 10 ..y = 100 ..toString); /// 輸出 Size{x: 10.0, y: 100.0}

7. foreach

通過 foreach 循環遍歷一個實現 Iterable 接口的對象

var items = [1, 2, 3, 4, 5];var maps = {'a': 1, 'b': 2};
items.where((i) => i > 2).forEach((i) => print(i)); // 3, 4, 5maps.forEach((key, value) => print('$key => $value')); // a => 1, b => 2

8. Switch and case

如果需要實現繼續到下一個 case 語句中繼續執行,則可以 使用 continue 語句跳轉到對應的標籤處繼續執行

var command = 'Close';switch (command.toLowerCase) { case 'close': print('close'); continue open; open: // 這是個標籤 case 'open': print('open'); break;}

9. Assert

如果條件表達式結果不滿足需要,則可以使用 assert 語句倆打斷代碼的執行,例如:assert(a == 1);

10. Exceptions

所有的 Dart 異常是非檢查異常。捕捉 exceptions 的時候可以通過 on 指定 exceptions 類型,再使用 catch 捕獲

try { breedMoreLlamas;} on OutOfLlamasException { buyMoreLlamas;} on Exception catch (e) { print('Unknown exception: $e');} catch (e, s) { // 函數 catch 可以帶有一個或兩個參數,第一個參數為拋出的異常對象,第二個為堆棧信息 print('Something really unknown: $e'); print('Stack trace:\n $s'); rethrow; // 通過 rethrow 可以將異常重新拋出}

11. Classes

Dart 中的類都是單繼承,但是同時支持 mixin 的繼承機制(除 Object 類,每個類都只有一個超類),所有的類都繼承於 Object,通過調用 runtimeType 判斷實例的類型。每個實例變量都會自動生成一個 getter 方法(隱含的), Non-final 實例變量還會自動生成一個 setter 方法。

Constructors

Dart 的構造函數同 Java 類似

class Size { num x, y;
Size(num nx, num y){ x = nx; this.y = y; // this 關鍵字只有當名字衝突時候使用,否則 Dart 推薦省略 this } Size(this.x, this.y); // Dart 通過語法糖省略了構造函數的賦值過程,效果同上}

如果沒有定義構造函數,則會有個默認構造函數。默認構造函數沒有參數,並且會調用超類的 沒有參數的構造函數。子類不會繼承超類的構造函數,子類如果沒有定義構造函數,則只有一個默認構造函數。

Dart 通過命名構造函數為類創建多個構造函數,同時指明意圖

class Size { num x, y;
Size(this.x, this.y);
Size.fromJson(Map json){ this.x = json['x']; this.y = json['y']; } // 因為構造函數不能繼承,如果希望子類也有超類一樣的命名構造函數,必須在子類中實現該構造函數 // 構造函數體執行之前除了可以調用超類構造函數之外,還可以初始化實例參數 // 初始化列表非常適合用來設置 final 變量的值 Size.fromJsonInit(Map json) : this.x = json['x'], this.y = json['y'];}

常量構造函數(如果類需要提供一個狀態不變的對象,通過 const 構造函數實現)

class ConstPoint { final num x; final num y;
const ConstPoint(this.x, this.y);}

工廠方法構造函數(如果一個類不需要每次都提供一個新的對象,通過 factory 構造函數實現)

class HttpCore { HttpCore._internal;
factory HttpCore { if (_instance == ) _instance = HttpCore._internal; return _instance; }
static HttpCore _instance;
static HttpCore get instance => HttpCore; void _request{ //... }}

每個類都隱式的定義了一個包含所有實例成員的接口, 並且這個類實現了這個接口,通過抽象類實現類似 Java 接口的功能。

abstract class Callback { void print(String msg);}
class A implements Callback{ @override void print(String msg) { print(msg); }}

Mixins Dart | 什麼是Mixin:https://www.jianshu.com/p/a578bd2c42aa

12. Asynchrony support

Future

loopIntegers { // 通過 then 進行獲取到 Future 對象後的操作 getListDelay.then((ints) => ints.forEach((i) => print(i)));}
// 生成一個 Future 對象Future<List<int>> getListDelay { return Future.delayed(Duration(seconds: 2), => List.generate(10, (delta) => delta));}

通過 async await 簡化 Future 操作

runUsingFuture { //... findEntrypoint.then((entrypoint) { return runExecutable(entrypoint, args); }).then(flushThenExit);}
// 簡化了 thenrunUsingAsyncAwait async { //... var entrypoint = await findEntrypoint; var exitCode = await runExecutable(entrypoint, args); await flushThenExit(exitCode);}

有時候要求調用很多異步方法,並且等待 所有方法完成後再繼續執行,通過使用 Future.wait 進行管理

Future deleteDone = deleteLotsOfFiles;Future copyDone = copyLotsOfFiles;Future checksumDone = checksumLotsOfOtherFiles;
Future.wait([deleteDone, copyDone, checksumDone]) .then((List values) { print('Done with all the long steps'); });

Stream Dart|什麼是 Stream:https://www.jianshu.com/p/a5d7758938ef

大概了解了 Dart 的語法,下節就開始寫 Flutter 啦~,環境的安裝具體查看官網,很詳細 Flutter 環境安裝 記得一定要配置鏡像,配置鏡像,配置鏡像

https://flutterchina.club/get-started/install/

作者其他文章:

  • 《django入門:環境及項目搭建》

  • 《django入門:數據模型》

  • 《django入門:視圖及模版》

  • 《django入門:Admin管理系統及表單》

  • 《django入門:通用視圖類重構視圖》

  • 《用django寫接口(入門篇)》

  • 《用django寫接口(優化篇)》

  • 《用django寫接口(實戰篇)》

今日問題:

Dart你怎麼看?

wwwjianshucom/p/8ddb16902ce6
作者:Kuky_xs原文:https://

你在看嗎?

聲明:文章觀點僅代表作者本人,PTTZH僅提供信息發布平台存儲空間服務。
喔!快樂的時光竟然這麼快就過⋯
more