Flutter定義了三種不同類型的Channel,它們分別是:
創(chuàng)新互聯(lián)專注于阿克陶企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),成都商城網(wǎng)站開發(fā)。阿克陶網(wǎng)站建設(shè)公司,為阿克陶等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站開發(fā),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
BasicMessageChannel:用于傳遞字符串和半結(jié)構(gòu)化的信息。
MethodChannel:用于傳遞方法調(diào)用(method invocation)。
EventChannel:用于數(shù)據(jù)流(event streams)的通信。
1、數(shù)值型-Number
2、布爾型-Boolean
3、字符串-String
4、列表-List
5、鍵值對(duì)-Map
1、int: 整數(shù),數(shù)值
2、double: 浮點(diǎn)型數(shù)值,帶有小數(shù)點(diǎn)
運(yùn)算符:+,-,*,/,~/(取整),%;
字符串操作
運(yùn)算符:+,*,==,[]
插值表達(dá)式:${expression}
常用屬性:length,isEmpty(是否為空)
Map 對(duì)象
Set是不能重復(fù)的集合,所以可以用Set去重;
String、int、double類型示例,如下:
String類型:
int類型:
double類型:
可以看到, Set集合可直接對(duì)String、int、double類型去重 ;
Map、List、bool類型和String、int、double類型對(duì)比示例,如下:
可以看到,當(dāng)自定義對(duì)象實(shí)例化為同一個(gè)對(duì)象時(shí),Set會(huì)過濾掉同一個(gè)實(shí)例化的對(duì)象;當(dāng)自定義對(duì)象實(shí)例化為不同對(duì)象時(shí),Set不會(huì)去重,即使對(duì)象數(shù)據(jù)內(nèi)容一樣,這不符合我們的業(yè)務(wù);
可以看到,重寫自定義對(duì)象==方法,Set還是不能去重;
上面重寫自定義對(duì)象hashCode和==方法,以title不同區(qū)分不同對(duì)象;
可以看到,重寫自定義對(duì)象hashCode和==方法,Set集合對(duì)自定義對(duì)象去重才有效;并且Set集合里有相同對(duì)象時(shí)(相同對(duì)象為上面自定義對(duì)象title值相同的對(duì)象),后面相同的對(duì)象就不會(huì)被加入Set集合里了( 如上面title一樣,boolValue不一樣,這樣被認(rèn)為相同的對(duì)象,因?yàn)橹貙懽远x對(duì)象hashCode和==方法,以title不同區(qū)分不同對(duì)象;Set集合里最開始加入的TestModel('a', boolValue: false),數(shù)據(jù)不會(huì)被相同對(duì)象TestModel('a', boolValue: true)覆蓋 )。
網(wǎng)上介紹flutter Set集合時(shí)一般會(huì)介紹Set沒有順序,這點(diǎn)不太理解,可能是不能通過索引來獲取對(duì)應(yīng)的值吧,像Java語言的Set集合確實(shí)是無序的,但flutter的Set集合保持著子元素的有序性。 如下:
可以看到,將Set通過toList()方法轉(zhuǎn)為L(zhǎng)ist后,List里子元素的順序和子元素插入Set集合的順序是一致;對(duì)于自定義對(duì)象亦是如此,可自行驗(yàn)證。
為什么Set集合會(huì)保持子元素插入順序呢
我們看下Set源碼,如下:
從源碼我們可知,Set()是一個(gè)工廠構(gòu)造方法,根據(jù)工廠構(gòu)造方法的特點(diǎn),Set是由LinkedHashSet實(shí)例化的。
從上面注釋可知,HashSet是無序的,LinkedHashSet保持著子元素插入的順序。而Set是由LinkedHashSet實(shí)例化的,所以Set保持著子元素插入的順序。
如想要深入分析LinkedHashSet,LinkedHashSet源碼中有很多external聲明的方法,可參考 如何找到flutter external聲明方法的實(shí)現(xiàn)
demo傳送門
Dart的 IO 庫包含了文件讀寫的相關(guān)類,它屬于 Dart 語法標(biāo)準(zhǔn)的一部分,所以通過 Dart IO 庫,無論是 Dart VM 下的腳本還是 Flutter,都是通過 Dart IO 庫來操作文件的,不過和 Dart VM 相比,F(xiàn)lutter 有一個(gè)重要差異是文件系統(tǒng)路徑不同,這是因?yàn)镈art VM 是運(yùn)行在 PC 或服務(wù)器操作系統(tǒng)下,而 Flutter 是運(yùn)行在移動(dòng)操作系統(tǒng)中,他們的文件系統(tǒng)會(huì)有一些差異。
Android 和 iOS 的應(yīng)用存儲(chǔ)目錄不同, PathProvider 插件提供了一種平臺(tái)透明的方式來訪問設(shè)備文件系統(tǒng)上的常用位置。該類當(dāng)前支持訪問兩個(gè)文件系統(tǒng)位置:
File代表一個(gè)整體的文件,他有三個(gè)構(gòu)造函數(shù),分別是:
文件讀取本身有兩種形式,一種是文本,一種是二進(jìn)制。
2.2.1 讀取文本內(nèi)容
如果是文本文件,F(xiàn)ile提供了readAsString、readAsLines、readAsStringSync、readAsLinesSync方法,讀取文本內(nèi)容
readAsString 一次性讀取所有文本
readAsLines 一行行的讀取文本
結(jié)果返回的是一個(gè)List,list中表示文件每行的內(nèi)容
readAsStringSync、readAsLinesSync同步讀取文本
2.2.2 讀取二進(jìn)制內(nèi)容
如果文件是二進(jìn)制,那么可以使用readAsBytes或者同步的方法readAsBytesSync:
dart中表示二進(jìn)制有一個(gè)專門的類型叫做Uint8List,他實(shí)際上表示的是一個(gè)int的List。
上面提到的讀取方式,都是一次性讀取整個(gè)文件,缺點(diǎn)就是如果文件太大的話,可能造成內(nèi)存空間的壓力。
所以File為我們提供了另外一種讀取文件的方法,流的形式來讀取文件.
示例
dart提供了open和openSync兩個(gè)方法來進(jìn)行隨機(jī)文件讀寫:
寫入和文件讀取一樣,可以一次性寫入或者獲得一個(gè)寫入句柄,然后再寫入。
一次性寫入的方法有四種,分別對(duì)應(yīng)字符串和二進(jìn)制
句柄形式可以調(diào)用openWrite方法,返回一個(gè)IOSink對(duì)象,然后通過這個(gè)對(duì)象進(jìn)行寫入:
默認(rèn)情況下寫入是會(huì)覆蓋整個(gè)文件的,但是可以通過下面的方式來更改寫入模式:
雖然dart中所有的異常都是運(yùn)行時(shí)異常,但是和java一樣,要想手動(dòng)處理文件讀寫中的異常,則可以使用try,catch:
我們還是以計(jì)數(shù)器為例,實(shí)現(xiàn)在應(yīng)用退出重啟后可以恢復(fù)點(diǎn)擊次數(shù)。 這里,我們使用文件來保存數(shù)據(jù):
1.引入PathProvider插件;在pubspec.yaml文件中添加如下聲明:
執(zhí)行 flutter pub get
2.實(shí)現(xiàn)如下
參考:
標(biāo)準(zhǔn)的Flutter App工程,包含標(biāo)準(zhǔn)的Dart層與Native平臺(tái)層
Flutter平臺(tái)插件工程,包含Dart層與Native平臺(tái)層的實(shí)現(xiàn)
Flutter純Dart插件工程,僅包含Dart層的實(shí)現(xiàn),往往定義一些公共Widget
參考資料: