原文: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']/<string>
Maps 鍵值對,例如:var map = {'one': 1, 'two': 2}
如果鍵值對需要添加新的鍵值對,直接指定即可,map['three'] = 3,若查找的鍵不存在,返回
參數化定義 var map = <string>{'one': 1, 'two': 2}/<string>
Runes 代表字符串的 UTF-32 code points,通常使用 \\\\uXXXX 的方式來表示 Unicode code point, XXXX 是4個 16 進制的數,例如 \\\\u2665 返回心形符號
Symbols 代表 Dart 程序中聲明的操作符或者標識符,幾乎不使用
3. Function
函數方法的可選參數通過在參數列表中用 {} 指定,例如:
<code>void say(String name, {String word = 'hello'}){/<code><code> print('$name say $word');/<code><code> }/<code>
<code>// 通過(可選參數名 + :)進行可選參數的賦值/<code><code>main{/<code><code> say('kuky', word: 'Hello World'); // kuky say Hello World/<code><code>}/<code>
word 參數為可選參數,默認值為 hello
4. Operators
操作符幾乎和別的語言類似,提個比較特殊的賦值操作符 ??= 和 ?.操作符
<code>var a = 1;/<code><code>var b ?? = a; // 如果 b 的值是 則將 a 賦值給 b,否則保持不變/<code><code>var c = size?.x; // 如果 size 為 則返回 ,否則返回 size.a 的值/<code>
5. Conditional Expressions
Dart 可以通過兩個特殊的操作符替換 if{} else{} 表達式
<code>/// condition? expr1: expr2 同 java 三目運算符/<code><code>var a = if(a < 0) -a : a/<code><code>/// expr1 ?? expr2 /<code><code>String toString => msg ?? super.toString // 如果 expr1 不為 則返回 expr1 否則返回 expr2/<code>
6. Cascade Notaion(..)
級聯操作符 (..) 可以在同一個對象上 連續調用多個函數以及訪問成員變量
<code>class Size{/<code><code> double x;/<code><code> double y;/<code>
<code> @override/<code><code> String toString {/<code><code> return 'Size{x: $x, y: $y}';/<code><code> }/<code><code>}/<code>
<code>var size = Size;/<code><code>/// 通過級聯操作符進行賦值,可以更加簡潔,!!如果函數返回值為 void 則不能進行級聯!!/<code><code>print(size/<code><code> ..x = 10/<code><code> ..y = 100/<code><code> ..toString); /// 輸出 Size{x: 10.0, y: 100.0}/<code>
7. foreach
通過 foreach 循環遍歷一個實現 Iterable 接口的對象
<code>var items = [1, 2, 3, 4, 5];/<code><code>var maps = {'a': 1, 'b': 2};/<code>
<code>items.where((i) => i > 2).forEach((i) => print(i)); // 3, 4, 5/<code><code>maps.forEach((key, value) => print('$key => $value')); // a => 1, b => 2/<code>
8. Switch and case
如果需要實現繼續到下一個 case 語句中繼續執行,則可以 使用 continue 語句跳轉到對應的標籤處繼續執行
<code>var command = 'Close';/<code><code>switch (command.toLowerCase) {/<code><code> case 'close':/<code><code> print('close');/<code><code> continue open;/<code><code> open: // 這是個標籤/<code><code> case 'open':/<code><code> print('open');/<code><code> break;/<code><code>}/<code>
9. Assert
如果條件表達式結果不滿足需要,則可以使用 assert 語句倆打斷代碼的執行,例如:assert(a == 1);
10. Exceptions
所有的 Dart 異常是非檢查異常。捕捉 exceptions 的時候可以通過 on 指定 exceptions 類型,再使用 catch 捕獲
<code>try {/<code><code> breedMoreLlamas;/<code><code>} on OutOfLlamasException {/<code><code> buyMoreLlamas;/<code><code>} on Exception catch (e) {/<code><code> print('Unknown exception: $e');/<code><code>} catch (e, s) { // 函數 catch 可以帶有一個或兩個參數,第一個參數為拋出的異常對象,第二個為堆棧信息/<code><code> print('Something really unknown: $e');/<code><code> print('Stack trace:\\n $s');/<code><code> rethrow; // 通過 rethrow 可以將異常重新拋出/<code><code>}/<code>
11. Classes
Dart 中的類都是單繼承,但是同時支持 mixin 的繼承機制(除 Object 類,每個類都只有一個超類),所有的類都繼承於 Object,通過調用 runtimeType 判斷實例的類型。每個實例變量都會自動生成一個 getter 方法(隱含的), Non-final 實例變量還會自動生成一個 setter 方法。
Constructors
Dart 的構造函數同 Java 類似
<code>class Size {/<code><code> num x, y;/<code>
<code> Size(num nx, num y){/<code><code> x = nx;/<code><code> this.y = y; // this 關鍵字只有當名字衝突時候使用,否則 Dart 推薦省略 this/<code><code> }/<code><code> Size(this.x, this.y); // Dart 通過語法糖省略了構造函數的賦值過程,效果同上/<code><code>}/<code>
如果沒有定義構造函數,則會有個默認構造函數。默認構造函數沒有參數,並且會調用超類的 沒有參數的構造函數。子類不會繼承超類的構造函數,子類如果沒有定義構造函數,則只有一個默認構造函數。
Dart 通過命名構造函數為類創建多個構造函數,同時指明意圖
<code>class Size {/<code><code> num x, y;/<code>
<code> Size(this.x, this.y);/<code>
<code> Size.fromJson(Map json){/<code><code> this.x = json['x'];/<code><code> this.y = json['y'];/<code><code> } // 因為構造函數不能繼承,如果希望子類也有超類一樣的命名構造函數,必須在子類中實現該構造函數/<code><code> // 構造函數體執行之前除了可以調用超類構造函數之外,還可以初始化實例參數/<code><code> // 初始化列表非常適合用來設置 final 變量的值/<code><code> Size.fromJsonInit(Map json)/<code><code> : this.x = json['x'],/<code><code> this.y = json['y'];/<code><code>}/<code>
常量構造函數(如果類需要提供一個狀態不變的對象,通過 const 構造函數實現)
<code>class ConstPoint {/<code><code> final num x;/<code><code> final num y;/<code>
<code> const ConstPoint(this.x, this.y);/<code><code>}/<code>
工廠方法構造函數(如果一個類不需要每次都提供一個新的對象,通過 factory 構造函數實現)
<code>class HttpCore {/<code><code> HttpCore._internal;/<code>
<code> factory HttpCore {/<code><code> if (_instance == ) _instance = HttpCore._internal;/<code><code> return _instance;/<code><code> }/<code>
<code> static HttpCore _instance;/<code>
<code> static HttpCore get instance => HttpCore;/<code><code> void _request{/<code><code> //.../<code><code> }/<code><code>}/<code>
每個類都隱式的定義了一個包含所有實例成員的接口, 並且這個類實現了這個接口,通過抽象類實現類似 Java 接口的功能。
<code>abstract class Callback {/<code><code> void print(String msg);/<code><code>}/<code>
<code>class A implements Callback{/<code><code> @override/<code><code> void print(String msg) {/<code><code> print(msg);/<code><code> }/<code><code>}/<code>
Mixins Dart | 什麼是Mixin:https://www.jianshu.com/p/a578bd2c42aa
12. Asynchrony support
Future
<code>loopIntegers {/<code><code> // 通過 then 進行獲取到 Future 對象後的操作/<code><code> getListDelay.then((ints) => ints.forEach((i) => print(i)));/<code><code>}/<code>
<code>// 生成一個 Future 對象/<code><code>Future<list>> getListDelay {/<list>/<code><code> return Future.delayed(Duration(seconds: 2), => List.generate(10, (delta) => delta));/<code><code>}/<code>
通過 async await 簡化 Future 操作
<code>runUsingFuture {/<code><code> //.../<code><code> findEntrypoint.then((entrypoint) {/<code><code> return runExecutable(entrypoint, args);/<code><code> }).then(flushThenExit);/<code><code>}/<code>
<code>// 簡化了 then/<code><code>runUsingAsyncAwait async {/<code><code> //.../<code><code> var entrypoint = await findEntrypoint;/<code><code> var exitCode = await runExecutable(entrypoint, args);/<code><code> await flushThenExit(exitCode);/<code><code>}/<code>
有時候要求調用很多異步方法,並且等待 所有方法完成後再繼續執行,通過使用 Future.wait 進行管理
<code>Future deleteDone = deleteLotsOfFiles;/<code><code>Future copyDone = copyLotsOfFiles;/<code><code>Future checksumDone = checksumLotsOfOtherFiles;/<code>
<code>Future.wait([deleteDone, copyDone, checksumDone])/<code><code> .then((List values) {/<code><code> print('Done with all the long steps');/<code><code> });/<code>
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你怎麼看?
你在看嗎?
閱讀更多 碼個蛋 的文章