摘要:中所有的基礎類型類等都繼承,默認值是,自帶和,而如果是或者的話,那么它只有一個方法。斷言失敗則程序立刻終止檢查是否為空字符串檢查是否小于等于檢查是否為檢查是否為字符串中,支持類型。類繼承類,通過關鍵字調用類的構造函數。泛型全面支持泛型。
目錄介紹
01.變量聲明
1.1 var聲明變量
1.2 變量和常量
1.3 dynamic和Object
02.數據類型
2.1 基本數據類型
2.2 String字符串
2.3 List數組
2.4 Map集合
03.Dart函數和運算符
3.1 Dart函數介紹
3.2 命名參數
3.3 參數默認值
3.4 void無返回值
3.5 匿名函數
3.6 運算符介紹
04.Dart流程控制
4.1 流程控制語句
4.2 if和else
4.3 for循環
4.4 while循環
4.5 break和continue
4.6 switch和case
4.7 assert斷言
05.Dart面向對象
5.1 類簡單介紹
5.2 構造函數
5.3 繼承類
5.4 重載和重寫
5.5 抽象類
5.6 訪問權限
5.7 靜態方法
5.8 泛型
06.Dart異步解讀
6.1 Future簡單介紹
6.1.1 普通異步案例
6.1.2 耗時異步案例
6.2 async/await介紹
6.3 看一個案例
07.Dart異常捕獲
7.1 異常處理形式
7.2 拋出異常
7.3 捕獲異常
7.4 Finally講解
08.Dart枚舉
8.1 枚舉使用
8.2 元數據
8.3 自定義注解
09.Dart字符串
9.1 String簡單介紹
9.2 單雙引號互相嵌套
9.3 字符串拼接方式
想換個工作,渴望同行內推我
個人信息
姓名:楊充【26歲】
郵箱:yangchong211@163.com
微信:13667225184
GitHub:https://github.com/yangchong211
博客匯總:https://github.com/yangchong2...
干活集中營:Android端技術博客和開源項目審核員
目前工作情況:在職狀態
技術項目和博客:GitHub項目7k以上star,follower1.1k以上,發表博客100多篇。
熱愛技術:開源項目和博客多次被鴻洋,郭霖,Android技術周刊,干活集中營等等推薦。
學歷:武漢軟件工程職業學院,大專學歷
工作年限:3年多
工作地點:北京
關于近期投遞簡歷一點感想
從進入Android這個行業以來,前兩次幾乎都是朋友內推,面試機會相對容易,都是一個App一個人做或者兩個人做,用戶相對來說并不多。這次想著離職,主要是想進入一個較大的平臺,大概可以理解為Android端有個至少四五人,可以進行技術交流,渴望自己能夠在技術上突破,這就像自己平時獨自跑步,和跟著一群跑馬拉松的人跑步,那種緊張感肯定是不一樣的。
近段時間,嘗試著向一些較大的公司投遞簡歷,大概在拉鉤上投了15個左右(不喜歡海投),發現絕大多數簡歷到不了技術那里,就被人事說學歷不夠,經驗不夠,工作不匹配等情況回絕。不過也可以理解,看簡歷無非就是學歷和經驗,貌似自己的履歷是差了一點。
這大概是第一次在網上發一個主動希望同行內推的介紹,如果你的公司有Android方面的招聘,能否內推一下我這個小人物,感謝。
01.變量聲明 1.1 var聲明變量
類似于kotlin中的var,它可以接收任何類型的變量,但最大的不同是Dart中var變量一旦賦值,類型便會確定,則不能再改變其類型,如:
var t; t="yc"; // 下面代碼在dart中會報錯,因為變量t的類型已經確定為String, // 類型一旦確定后則不能再更改其類型。 t=1000;
最大的不同是Dart中var變量一旦賦值,類型便會確定,則不能再改變其類型。因為Dart本身是一個強類型語言,任何變量都是有確定類型的,在Dart中,當用var聲明一個變量后,Dart在編譯時會根據第一次賦值數據的類型來推斷其類型,編譯結束后其類型就已經被確定。
思考一下,dart在編譯時是如何確定數據的類型呢?
1.2 變量和常量
變量如下所示
var curPage = 0; var title = "瀟湘劍雨:小楊逗比";
Dart 不需要給變量設置 setter getter 方法, 這和 kotlin 等類似。Dart 中所有的基礎類型、類等都繼承 Object ,默認值是 NULL, 自帶 getter 和 setter ,而如果是 final 或者 const 的話,那么它只有一個 getter 方法。
const 的值在編譯期確定,final 的值要到編譯時才確定。
Dart 中 final 表示常量
//final 表示常量 final title = "瀟湘劍雨:小楊逗比";
static const 組合代表了靜態常量
//static const 組合代表了靜態常量 static const String complete = "COMPLETE";
final和const區別
兩者區別在于:const 變量是一個編譯時常量,final變量在第一次使用時被初始化。被final或者const修飾的變量,并且變量類型可以省略。
注意點
const變量同時也是final變量,實例變量可以為final但不能是const。
編譯錯報錯,原因final變量只能賦值一次!
//定義初始化一個變量 final double number = 13.14; number = 520; //調用打印數字方法 printNumber(number);
在Java中可以直接通過 + 號將字符串和int類型拼接,但是在Dart中是不行的。
//在Java中,下面操作可行 ToastUtils.showRoundRectToast("二維碼掃描"+1000); //在dart中,下面錯誤操作,編譯不通過,直接會有紅色提示 int yc = 0; print("瀟湘劍雨" + yc); //在dart中,下面正確操作 int yc = 0; print("瀟湘劍雨" + yc.toString());1.3 dynamic和Object
Object 是dart所有對象的根基類,也就是說所有類型都是Object的子類(包括Function和Null),所以任何類型的數據都可以賦值給Object聲明的對象.
dynamic與var一樣都是關鍵詞,聲明的變量可以賦值任意對象.而dynamic與Object相同之處在于,他們聲明的變量可以在后期改變賦值類型.
dynamic t; Object x; t = "hi world"; x = "Hello Object"; //下面代碼沒有問題 t = 1000; x = 1000;
dynamic與Object不同的是,dynamic聲明的對象編譯器會提供所有可能的組合,而Object聲明的對象只能使用Object的屬性與方法, 否則編譯器會報錯. 如:
dynamic a; Object b; main() { a = ""; b = ""; printLengths(); } printLengths() { // no warning print(a.length); // warning: // The getter "length" is not defined for the class "Object" print(b.length); }
變量a不會報錯, 變量b編譯器會報錯
dynamic的這個特性與Objective-C中的id作用很像.
dynamic的這個特點使得我們在使用它是需要格外注意,這很容易引入一個運行時錯誤.
02.數據類型 2.1 基本數據類型
var 可以定義變量,同時 Dart 屬于動態類型語言,支持閉包。
Dart 中 number 類型分為 int 和 double ,其中 java 中的 long 對應的也是 Dart 中的 int 類型。Dart 中沒有 float 類型。
//int類型 這里沒有long類型 var positionIndex = 0; //double類型 這里沒有float類型 var time = 1993.03;
這里提個小建議,聲明變量的時候,可以選擇加上具體類型。添加類型可以更加清晰表達你的意圖。
//定義初始化一個變量 double number = 13.14;
Dart 下只有 bool 型可以用于 if 等判斷,不同于 JS 這種使用方式是不合法的 var g = "null"; if(g){} 。
以bool代表布爾值,只有兩個對象是布爾類型的,那就是true和false所創建的對象,這兩個對象都是編譯時常量。
//類似Java中的布爾類型 bool mIsLogin = false; if (!mIsLogin) { //沒有登陸 print("沒有登陸"); } else { //已經登陸 Navigator.of(context).push(new MaterialPageRoute(builder: (context) { return new CollectPage(); })); }
注意,下面這種情況會報錯
String name ="yc"; //報錯 因為name不是bool類型 if(name){ print(name); }
可以使用的是先式的檢查值。assert是語言內置的斷言的函數,僅在檢查模式有效,在開發過程中,除非條件為真,否則會引發異常。(斷言失敗則程序立刻終止)
// 檢查是否為空字符串 var fullName = "doubi"; assert(fullName.isEmpty); // 檢查是否小于等于0 var hitPoints = 0; assert(hitPoints <= 0); // 檢查是否為 null. var unicorn; assert(unicorn == null); // 檢查是否為 NaN. var iMeantToDoThis = 0 / 0; assert(iMeantToDoThis.isNaN);2.2 String字符串
Dart 中,switch 支持 String 類型。后面會多帶帶拿出來講解一下。
//字符串 var title = "瀟湘劍雨:小楊逗比";2.3 List數組
聲明一個list非常的簡單,可以簡單使用方括號[]定義list。下面是list的常用操作。
main(Listargs) { //或者 List arr1 = [1,2,3,4]; var arr2 = [1,2,3,4]; print(list); //Output: [1, 2, 3, 4] //Length 長度 print(list.length); //Selecting single value 獲取單個值 print(list[1]); //Outout: 2 //Adding a value 添加值到list list.add(10); //Removing a single isntance of value 刪除單個值 list.remove(3); //Remove at a particular position 刪除指定位置的值 list.removeAt(0); }
注意:第一個元素索引是0,最后一個元素是length-1
如果你想定義一個編譯時常量list,例如,list的內容是不可改變的,可以使用關鍵字const
var list = const [1,2,3,4];2.4 Map集合
定義map也很簡單。可以使用花括號{}定義map。
void test() { var map = { "key1": "value1", "key2": "value2", "key3": "value3" }; //Fetching the values 獲取值 print(map["key1"]); //Output: value1 print(map["test"]); //Output: null //Add a new value 添加值 map["key4"] = "value4"; //Length 獲取長度 print(map.length); //Check if a key is present 檢查是否存在 var containsKey = map.containsKey("value1"); print(containsKey); var entries = map.entries; var values = map.values; }
打印日志
2019-06-20 17:22:39.200 4281-4329/com.hwmc.auth I/flutter: value1 2019-06-20 17:22:39.200 4281-4329/com.hwmc.auth I/flutter: null 2019-06-20 17:22:39.200 4281-4329/com.hwmc.auth I/flutter: 4 2019-06-20 17:22:39.200 4281-4329/com.hwmc.auth I/flutter: false
也可以使用map構造函數定義map。
可以發現map可以存儲多種類型的數據
var squares = new Map(); squares["a"] = 1; squares["b"] = 2; squares["c"] = 3.0; squares["d"] = [1,2]; squares["e"] = "yc逗比"; print(squares["a"]); print(squares["e"]);
打印日志
2019-06-20 17:27:32.841 4281-4329/com.hwmc.auth I/flutter: 1 2019-06-20 17:27:32.841 4281-4329/com.hwmc.auth I/flutter: yc逗比03.Dart函數和運算符 3.1 Dart函數介紹
dart中的函數和JavaScript中有點類似。你需要定義就是函數的名字、返回值(有返回值或者void)、參數。
void test(){ var name = fullName("楊充", "逗比"); print(name); } String fullName(String firstName, String lastName) { return "$firstName $lastName"; }3.2 命名參數
dart有個叫命名參數的東西。當你調用函數的時候,你必須指定參數的名字。要使用命名參數,可以將函數的參數包括在花括號{}內。
如果你在調用命名參數的函數時,沒有指定參數的名字,則會提示紅色報錯,無法通過編譯。
void test(){ var name = fullName("楊充", "逗比"); print(name); } String fullName(String firstName, String lastName) { return "$firstName $lastName"; }3.3 參數默認值
你可以給函數的命名參數一個默認值。下面的例子給lastName一個默認值。
void test(){ var name = fullName("楊充", "逗比"); print(name); } fullName(String firstName, String lastName) { return "$firstName $lastName"; }3.4 void無返回值
大多數都是void無返回值的函數,這個跟java中類似。沒什么好講的……
3.5 匿名函數
在dart中函數比較靈活,例如,你可以將函數當參數傳遞給另一個函數。
void test(){ out(printOutLoud); } out(void inner(String message)) { inner("Message from inner function"); } printOutLoud(String message) { print(message.toUpperCase()); }
這里定義一個函數名字為out,需要一個函數參數。然后我定義一個名為printOutLoud的函數,他所做的就是將字符串以大寫的形式打印。
dart 也有匿名函數,所以上面的例子中不用預定一個函數,而是傳遞一個匿名函數。
另一個匿名函數的例子。
3.6 運算符介紹這部分和java差不多,可以直接看我java部分的博客:運算符
04.Dart流程控制 4.1 Dart流程控制
大概有這么多
if和else
for循環
while循環
break和continue
switch和case
assert斷言
4.2 if和else
if-else 和其他語言一樣比較簡單。
var number = 57; if (number > 100) { print("Large Number"); } else if (number < 100) { print("Small Number"); } else { print("Number is 100"); }
可以用三元運算符代替if-else
int age = 60; String status = age < 50 ? "年輕人" : "老年人";4.3 for循環
for循環和java幾乎是一樣的,代碼如下
void test() { for (int i = 0; i < 10; i++) { print("$i"); } }4.4 while循環
while循環如下所示
void test() { int i = 0; while(i < 10) { print("$i"); i++; } }
The classic for do while loop. 典型的do while循環。
void test() { int i = 0; do { print("$i"); i++; } while (i < 10); }4.6 break和continue 4.7 switch和case
代碼如下所示
void test() { int age = 50; switch(age) { case 10: print("Too Young."); break; case 20: case 30: print("Still Young!"); break; case 40: print("Getting old."); break; case 50: print("You are old!"); break; } }05.Dart面向對象 5.1 類簡單介紹
創建一個類和創建類的實例
void test1(){ Dog d = new Dog(); } class Dog { } var cat = new Cat("逗比", 12); class Cat { String name; int age; Cat(String name, int age) { this.name = name; this.age = age; } }5.2 構造函數
普通構造函數
var cat = new Cat("逗比", 12); class Cat { String name; int age; Cat(String name, int age) { this.name = name; this.age = age; } }
命名構造函數
給構造函數提供了名稱,這樣做使得不同的構造函數變的更加清晰。
Map map = new Map(); map["name"]= "哈巴狗"; map["age"] = 5; Dog d = new Dog.newBorn(map); class Dog { String name; int age; Dog(this.name, this.age); Dog.newBorn(Map json) { name = json["name"]; age = json["age"]; } }5.3 繼承類
可以使用extends關鍵字繼承其他的類。
Pug 類繼承Dog類,通過super關鍵字調用Dog類的構造函數。
Pug p = new Pug("逗比哈巴狗", 5); print(p.name); class Dog { String name; int age; Dog(this.name, this.age); Dog.newBorn() { name = "Doggy"; age = 0; } } class Pug extends Dog { Pug(String name, int age): super(name, age); }
也可以通過this關鍵字,在冒號之后調用同一個類中的其他構造函數。
定義了兩個命名構造函數,他們只需要dog的名字,然后調用Pug的默認構造函數。
Pug p = new Pug.small("傻逼"); print(p.name); class Dog { String name; int age; Dog(this.name, this.age); Dog.newBorn() { name = "逗比哈巴狗"; age = 0; } } class Pug extends Dog { Pug(String name, int age): super(name, age); Pug.small(String name): this(name, 1); Pug.large(String name): this(name, 3); }5.4 重載和重寫
方法重寫
代碼如下,最后打印值是:你真是個逗比
Pug p = new Pug(); print(p.bark()); class Dog { bark() { print("Bow Wow"); } } class Pug extends Dog { @override bark() { print("你真是個逗比!"); } }
方法重載
5.5 抽象類
可以通過abstract關鍵字聲明抽象類
只需要在類聲明前添加abstract關鍵字,方法不需要。方法只需要簽名,不需要實現。
abstract class AbstractDog { void eat(); void _hiddenMethod(); } class SmallDog extends AbstractDog{ @override void _hiddenMethod() { } @override void eat() { } }5.6 訪問權限
默認類中的所有屬性和方法是public的。在dart中,可以在屬性和方法名前添加“_”使私有化。現在讓我們使name屬性私有化。
可以發現,調用私有化變量或者方法的時候會出現紅色警告
void test() { Dog d = new Dog("哈巴狗", 5); //這個報錯 print(d.name); print(d.age); }
Dog代碼如下所示
class Dog { String _name; int age; Dog(this._name, this.age); String get respectedName { return "Mr.$_name"; } set respectedName(String newName) { _name = newName; } Dog.newBorn() { _name = "哈巴狗"; age = 0; } bark() { print("Bow Wow"); } _hiddenMethod() { print("I can only be called internally!"); } }5.7 靜態方法
如果想讓方法或者屬性靜態化,只需要在聲明前添加static關鍵字。
void test() { Dog.bark(); } class Dog { static bark() { print("Bow Wow"); } }5.8 泛型
dart全面支持泛型。假設你想在你定義的類中,想持有任意類型的數據。如下是怎樣使用泛型定義這樣的類。
DataHolder06.Dart異步解讀 6.1 Future簡單介紹dataHolder = new DataHolder("Some data"); print(dataHolder.getData()); dataHolder.setData("New Data"); print(dataHolder.getData()); //下面這個會報錯,因為dataHolder對象在創建的時候就已經限制為String類型 dataHolder.setData(123); print(dataHolder.getData()); class DataHolder { T data; DataHolder(this.data); getData() { return data; } setData(data) { this.data = data; } }
async 庫中有一個叫Future的東西。Future是基于觀察者模式的。如果你熟悉Rx或者JavaScript的Promises,你就很容易明白了。
首先先看一下下面的案例,看看它們之間有什么區別?
void testA() async{ new Future(() { return "This is a doubi"; }); } Future testB() async{ return new Future (() { return "This is a doubi"; }); } Future testC() { return new Future (() { return "This is a doubi"; }); }
Future是支持泛型的,例如Future,通過T指定將來返回值的類型。
定義了一個叫getTest的函數,返回值為Future
當調用了getTest方法,他返回Future
void test() { getTest().then((value) { print("測試----------"+value); }).catchError((error) { print("測試----------Error"); }); } FuturegetTest() { return new Future (() { return "This is a doubi"; }); } //打印結果 2019-06-21 17:11:12.941 16501-16583/com.hwmc.auth I/flutter: 測試----------This is a doubi
下面這個案例會發生異常
void test() { getTest().then((value) { print("測試----------"+value); }).catchError((error) { print("測試----------Error"); }); } FuturegetTest() { return new Future (() { return "This is a doubi"; }); } //打印結果 2019-06-21 17:18:46.896 16501-16583/com.hwmc.auth I/flutter: 測試----------Error
在生產環境中都是一些耗時的操作,例如,網絡調用,我們可以使用Future.delayed()模仿。
現在如果你運行,你將需要2秒,才能返回結果。
void test() { getTest().then((value) { print("測試----------"+value); }).catchError((error) { print("測試----------Error"); }); } FuturegetTest() { return new Future .delayed(new Duration(milliseconds: 2000),() { return "This is a doubi"; }); }
接下來再看一個案例。在調用函數之后,我們添加了print語句。在這種場景中,print語句會先執行,之后future的返回值才會打印。這是future的預期行為.但是如果我們希望在執行其他語句之前,先執行future。
void test() { getTest().then((value) { print("測試----------"+value); }).catchError((error) { print("測試----------Error"); }); print("測試----------逗比是這個先執行嗎"); } Future6.2 async/await介紹getTest() { return new Future .delayed(new Duration(milliseconds: 2000),() { return "This is a doubi"; }); } 2019-06-21 17:26:16.619 16501-16583/com.hwmc.auth I/flutter: 測試----------逗比是這個先執行嗎 2019-06-21 17:26:17.176 16501-16583/com.hwmc.auth I/flutter: 測試----------This is a doubi
思考一下,看了上面的案例,對于future的預期行為,如果我們希望在執行其他語句之前,先執行future,該怎么操作呢?
這就需要用到需要用到async/await。在test函數的花括號開始添加async關鍵字。我們添加await關鍵字在調用getTest方法之前,他所做的就是在future返回值之后,繼續往下執行。我們將整個代碼包裹在try-catch中,我們想捕獲所有的異常,和之前使用catchError回調是一樣。使用awiat關鍵字,必須給函數添加async關鍵字,否則沒有效果。
注意:要使用 await,其方法必須帶有 async 關鍵字。可以使用 try, catch, 和 finally 來處理使用 await 的異常!
Future test() async { try { String value = await getTest(); print("測試----------"+value); } catch(e) { print("測試----------Error"); } print("測試----------逗比是這個先執行嗎"); } Future6.3 看一個案例getTest() { return new Future .delayed(new Duration(milliseconds: 2000),() { return "This is a doubi"; }); } 2019-06-21 17:32:37.701 16501-16583/com.hwmc.auth I/flutter: 測試----------This is a doubi 2019-06-21 17:32:37.702 16501-16583/com.hwmc.auth I/flutter: 測試----------逗比是這個先執行嗎
一個 async 方法 是函數體被標記為 async 的方法。 雖然異步方法的執行可能需要一定時間,但是 異步方法立刻返回 - 在方法體還沒執行之前就返回了。
void getHttp async { // TODO --- }
在一個方法上添加 async 關鍵字,則這個方法返回值為 Future。
例如,下面是一個返回字符串的同步方法:
String loadAppVersion() => "1.0.2"
使用 async 關鍵字,則該方法返回一個 Future,并且 認為該函數是一個耗時的操作。
FutreloadAppVersion() async => "1.0.2"
注意,方法的函數體并不需要使用 Future API。 Dart 會自動在需要的時候創建 Future 對象。
好的代碼是這樣的
void main() { //調用異步方法 doAsync(); } // 在函數上聲明了 async 表明這是一個異步方法 FuturedoAsync() async { try { // 這里是一個模擬請求一個網絡耗時操作 var result = await getHttp(); //請求出來的結果 return printResult(result); } catch (e) { print(e); return false; } } //將請求出來的結果打印出來 Future printResult(summary) { print(summary); } //開始模擬網絡請求 等待 5 秒返回一個字符串 getHttp() { return new Future.delayed(Duration(seconds: 5), () => "Request Succeeded"); }
不好的寫法
void main() { doAsync(); } Future07.Dart異常捕獲 7.1 異常處理形式doAsync() async { return getHttp().then((r){ return printResult(r); }).catchError((e){ print(e); }); } Future printResult(summary) { print(summary); } Future getHttp() { return new Future.delayed(Duration(seconds: 5), () => "Request Succeeded"); }
dart 使用經典的try-catch處理異常,使用關鍵字throw拋出一個異常。
7.2 拋出異常
看看如何拋出異常
void test1(){ divide(10, 0); } divide(int a, int b) { if (b == 0) { throw new IntegerDivisionByZeroException(); } return a / b; }
當b變量的值為0的時候,拋出一個內置的異常IntegerDivisionByZeroException。
如何定義異常日志呢?
可以在異常中攜帶一個字符串信息。
void test1(){ divide(10, 0); } divide(int a, int b) { if (b == 0) { throw new Exception("逗比,不能為0的"); } return a / b; }7.3 捕獲異常
某種類型的異常可以通過on關鍵字捕獲,如下:
void test1(){ try { divide(10, 0); } on IntegerDivisionByZeroException { print("逗比,異常被捕獲了"); } } divide(int a, int b) { if (b == 0) { throw new IntegerDivisionByZeroException(); } return a / b; }
注意問題,捕獲的異常層級要大于拋出的異常,否則捕獲會失敗
還是會拋出異常"逗比,不能為0的",因為Exception比IntegerDivisionByZeroException層級要高。
void test1(){ try { divide(10, 0); } on IntegerDivisionByZeroException { print("逗比,異常被捕獲了"); } } divide(int a, int b) { if (b == 0) { throw new Exception("逗比,不能為0的"); } return a / b; }
如果你不知道拋出異常的類型,或者不確定,可以使用catch塊處理任意類型的異常。
void test1(){ try { divide(10, 0); } on IntegerDivisionByZeroException { print("逗比,異常被捕獲了"); } catch (e) { print(e); } } divide(int a, int b) { if (b == 0) { throw new Exception("yc other exception."); } return a / b; }7.4 Finally講解
dart也提供了finally塊,即是否發生異常這個塊都會執行。
void test1(){ try { divide(10, 0); } on IntegerDivisionByZeroException { print("逗比,異常被捕獲了"); } catch (e) { print(e); }finally { print("I will always be executed!"); } } divide(int a, int b) { if (b == 0) { throw new Exception("yc other exception."); } return a / b; }08.Dart枚舉 8.1 枚舉使用
dart 支持枚舉,用法和java一樣。
Dog d = new Dog("哈巴狗", 12, CurrentState.sleeping); print(d.state == CurrentState.sleeping); //Prints "true" enum CurrentState { sleeping, barking, eating, walking } class Dog { String name; int age; CurrentState state; Dog(this.name, this.age, this.state); static bark() { print("Bow Wow"); } }8.2 元數據
使用元數據給代碼添加額外信息,元數據注解是以@字符開頭,后面是一個編譯時常量或者調用一個常量構造函數。
有三個注解所有的Dart代碼都可使用:@deprecated、@override,@proxy,下面直接上@deprecated的示例:
元數據可以在library、typedef、type parameter、constructor、factory、function、field、parameter、或者variable聲明之前使用,也可以在import或者export指令之前使用,使用反射可以再運行時獲取元數據信息。
8.3 自定義注解
定義自己的元數據注解。下面的示例定義一個帶有兩個參數的@toDo注解:
void test1() { doSomething(); } @toDo("seth", "make this do something") void doSomething() { print("do something"); } class toDo { final String who; final String what; const toDo(this.who, this.what); }09.Dart字符串 9.1 String簡單介紹
Dart字符串是UTF-16編碼的字符序列,可以使用單引號或者雙引號來創建字符串:
String str1 = "單引號字符串"; String str2 = "雙引號字符串"; print(str1); //輸出:單引號字符串 print(str2); //輸出:雙引號字符串9.2 單雙引號互相嵌套
String中單、雙引號互相嵌套情況如下所示
String str1 = "單引號中的"雙引號"字符串"; String str2 = "雙引號中的"單引號"字符串"; print("yc-str1--" + str1); print("yc-str2--" + str2); //單引號里面有單引號,必須在前面加反斜杠 String str3 = "單引號中的"單引號""; String str4 = "雙引號里面有雙引號,"雙引號""; print("yc-str3--" + str3); print("yc-str4--" + str4);
打印值
2019-06-21 17:52:07.722 16501-16583/com.hwmc.auth I/flutter: yc-str1--單引號中的"雙引號"字符串 2019-06-21 17:52:07.723 16501-16583/com.hwmc.auth I/flutter: yc-str2--雙引號中的"單引號"字符串 2019-06-21 17:52:07.723 16501-16583/com.hwmc.auth I/flutter: yc-str3--單引號中的"單引號" 2019-06-21 17:52:07.723 16501-16583/com.hwmc.auth I/flutter: yc-str4--雙引號里面有雙引號,"雙引號"
注意點::
單引號嵌套單引號之間不允許出現空串(不是空格),雙引號嵌套雙引號之間不允許出現空串:
//String str5 = "單引號""""單引號"; //報錯了,逗比 String str6 = "單引號"" ""單引號"; String str7 = "單引號""*""單引號"; String str8 = "雙引號"" ""雙引號"; String str9 = "雙引號""*""雙引號"; //String str10 = "雙引號""""雙引號"; //報錯了,逗比 print("yc-str6--" + str6); print("yc-str7--" + str7); print("yc-str8--" + str8); print("yc-str9--" + str9);
打印值
2019-06-21 17:56:21.847 16501-16583/com.hwmc.auth I/flutter: yc-str6--單引號 單引號 2019-06-21 17:56:21.847 16501-16583/com.hwmc.auth I/flutter: yc-str7--單引號*單引號 2019-06-21 17:56:21.847 16501-16583/com.hwmc.auth I/flutter: yc-str8--雙引號 雙引號 2019-06-21 17:56:21.847 16501-16583/com.hwmc.auth I/flutter: yc-str9--雙引號*雙引號其他介紹 01.關于博客匯總鏈接
1.技術博客匯總
2.開源項目匯總
3.生活博客匯總
4.喜馬拉雅音頻匯總
5.其他匯總
02.關于我的博客github:https://github.com/yangchong211
知乎:https://www.zhihu.com/people/...
簡書:http://www.jianshu.com/u/b7b2...
csdn:http://my.csdn.net/m0_37700275
喜馬拉雅聽書:http://www.ximalaya.com/zhubo...
開源中國:https://my.oschina.net/zbj161...
泡在網上的日子:http://www.jcodecraeer.com/me...
郵箱:yangchong211@163.com
阿里云博客:https://yq.aliyun.com/users/a... 239.headeruserinfo.3.dT4bcV
segmentfault頭條:https://segmentfault.com/u/xi...
掘金:https://juejin.im/user/593943...
博客匯總項目開源地址:https://github.com/yangchong2...文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75099.html
摘要:工具可以報告兩種問題警告和錯誤。警告只是說明代碼可能無法正常工作,但不會阻止程序執行。中的是一組無序的集合。其中來指定異常類型,來捕獲異常對象。其中代表只導入指定的部分,代表除了指定的部分都導入。 本文首發于微信公眾號「劉望舒」 前言 Dart是Flutter SDK指定的語言,因此要學習Flutter,Dart是必須掌握的。關于Dart可以寫一本書了,這里用一篇文章來介紹下Dart的精...
摘要:月日,谷歌正式發布了的。到底能不能成為跨平臺開發終極之選是基于前端誕生的,但是對前端開發來說,的環境配置很麻煩,需要原生的平臺知識,還要擔心遇上網絡問題。現在已經不是曾經的小眾框架,這兩年里它已經逐步成長為主流的跨平臺開發框架之一。 ...
摘要:注釋處的方法是程序的入口,使用了符號,這是中單行函數或方法的簡寫,等價于如下代碼方法是框架的入口,如果不返回方法,那么執行的是一個控制臺應用。 本文首發于微信公眾號「劉望舒」 前言 最近的Google I/O大會上,Flutter1.5 開始支持移動、Web、桌面和嵌入式設備,從不溫不火的sky一直進化到如今熱門的Flutter,Flutter的發展已經超出很多人的想象。我對跨平臺技術一...
摘要:在去年大展上發布首個版后,正式版于年月召開的上正式發布。今天在巴塞羅那召開的發布會上,正式發布了跨平臺框架的版本。支持此版本包括,該也于昨天發布。除了,團隊還發布了的預覽版,這是一套用于和的性能工具。 在去年 MWC 大展上發布首個 Beta 版后,Flutter 1.0 正式版于 2018 年 12 月召開的 Flutter Live 2018 上正式發布。今天在巴塞羅那召開的 MW...
閱讀 843·2021-11-24 10:44
閱讀 2778·2021-11-11 16:54
閱讀 3159·2021-10-08 10:21
閱讀 2066·2021-08-25 09:39
閱讀 2899·2019-08-30 15:56
閱讀 3459·2019-08-30 13:46
閱讀 3493·2019-08-23 18:09
閱讀 2066·2019-08-23 17:05