Flutter入门:dart基础
構(gòu)造函數(shù)
在dart中構(gòu)造函數(shù)的名字可以是 ClassName 或者 ClassName.identifier。如:
class Point {num x, y;Point(this.x, this.y);// 命名構(gòu)造函數(shù)Point.fromJson(Map data) {...} }以下代碼使用 Point 和 Point.fromJson() 構(gòu)造函數(shù)創(chuàng)建 Point 對象:
var p1 = Point(2, 2); var p2 = Point.fromJson({'x': 1, 'y': 2});以下代碼具有相同的效果, 但是構(gòu)造函數(shù)前面的的 new 關(guān)鍵字是可選的:
var p1 = new Point(2, 2); var p2 = new Point.fromJson({'x': 1, 'y': 2});版本提示: 在 Dart 2 中 new 關(guān)鍵字變成了可選的。
factory工廠構(gòu)造函數(shù)
factory關(guān)鍵字用于修飾構(gòu)造函數(shù),這種構(gòu)造函數(shù)稱為工廠構(gòu)造函數(shù)。
當(dāng)執(zhí)行構(gòu)造函數(shù)并不總是創(chuàng)建這個類的一個新實例時,則使用 factory 關(guān)鍵字。 例如,一個工廠構(gòu)造函數(shù)可能會返回一個 cache 中的實例, 或者可能返回一個子類的實例。
提示: 工廠構(gòu)造函數(shù)無法訪問 this。
工廠構(gòu)造函數(shù)的調(diào)用方式與其他構(gòu)造函數(shù)一樣
dynamic和var和object
dynamic
在dart中dynamic是一個關(guān)鍵字,表示動態(tài)變量。被dynamic修飾的變量可以是任意類型,編譯時不會檢查類型,只有在運行時才推斷類型。且同時可以隨著值的變化變成另外一個類型。
dynamic x = 'hello';//編譯時不會揣測數(shù)據(jù)類型,但是運行時會推斷 print(x.runtimeType);//String print(x); //但是這樣的壞處就是會讓dart的語法檢查失效,所以有可能會造成混亂而不報錯 //所以不要直接使用dynamic x = 123; print(x.runtimeType);//int,說明類型是可變的 print(x);var
var同樣是一個關(guān)鍵字,所謂的“弱類型“。被它修飾的變量也可以是任意類型,但是編譯時就會確定類型,所以后續(xù)不能再改變類型。
var a = 'hello'; print(a.runtimeType); print(a); //a = 123;//會報錯,因為第一句已經(jīng)將類型確定下來 a = '123'; print(a);var實際上就是開發(fā)者并不關(guān)心它的類型,有編譯器自動判斷類型
Object
Object與java中的一樣,是所有class的基類。它是靜態(tài)類型檢查,所以如果要使用其子類的函數(shù),需要先進(jìn)行類型轉(zhuǎn)換
Object w = 1; print(w.runtimeType); print(w); //不能調(diào)用Object不存在的方法Map
在dart中,Map可以如json格式一般直觀的創(chuàng)建,如
var gifts = {'first': 'partridge','second': 'turtledoves','fifth': 'golden rings' };var nobleGases = {2: 'helium',10: 'neon',18: 'argon', };當(dāng)然也可以使用構(gòu)造函數(shù),如
var gifts = Map(); gifts['first'] = 'partridge'; gifts['second'] = 'turtledoves'; gifts['fifth'] = 'golden rings';var nobleGases = Map(); nobleGases[2] = 'helium'; nobleGases[10] = 'neon'; nobleGases[18] = 'argon';使用時也一樣,直接用中括號[]取值,沒有g(shù)et之類的函數(shù)。
String first = gifts['first']json
jsonDecode
jsonDecode是將json格式字符串轉(zhuǎn)成json
dynamic jsonDecode(String source, {Object reviver(Object key, Object value)})這里dynamic是dart中的一個關(guān)鍵字,就是動態(tài)類型。這里不細(xì)說了。
jsonDecode實際上返回的會是Map或者List,分別對應(yīng)JsonObject和JsonArray
如果是Map,可以直接通過“[]“訪問屬性
如果是List,則可以通過forEach遍歷
var array = jsonDecode(str); array.forEach((item){var name = item['name']; //這里假設(shè)了array里是Map,也可以是List,String,int等,也可以是混合的 });jsonEncode
jsonEncode是將object轉(zhuǎn)成json格式的字符串。
String jsonEncode(Object value, {Object toEncodable(Object nonEncodable)})這里注意object類必須實現(xiàn)Map toJson()函數(shù),否則報錯
Unhandled exception:
Converting object to an encodable object failed: Instance of ‘xxx’
這是因為jsonEncode正是調(diào)用這個函數(shù)才將一個對象轉(zhuǎn)成字符串的,而這個函數(shù)實際上就是將這個對象轉(zhuǎn)成Map。
比如:
class JsonDemo {String name;String value;Map toJson() {Map map = new Map();map["name"]= this.name;map["value"] = this.value;return map;} }解析
JsonDemo jsonDemo = new JsonDemo(); ... String str = jsonEncode(jsonDemo);關(guān)注公眾號:BennuCTech,發(fā)送“電子書”獲取經(jīng)典電子資料。
總結(jié)
以上是生活随笔為你收集整理的Flutter入门:dart基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样查看.a和so文件中的接口
- 下一篇: Flutter入门:applicatio