作者: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, 5
maps.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);
}
// 簡化了 then
runUsingAsyncAwait 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你怎麼看?
你在看嗎?