Dart的 IO 庫(kù)包含了文件讀寫(xiě)的相關(guān)類(lèi),它屬于 Dart 語(yǔ)法標(biāo)準(zhǔn)的一部分,所以通過(guò) Dart IO 庫(kù),無(wú)論是 Dart VM 下的腳本還是 Flutter,都是通過(guò) Dart IO 庫(kù)來(lái)操作文件的,不過(guò)和 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ì)有一些差異。
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、安陽(yáng)ssl等。為上千多家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢(xún)和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的安陽(yáng)網(wǎng)站制作公司
Android 和 iOS 的應(yīng)用存儲(chǔ)目錄不同, PathProvider 插件提供了一種平臺(tái)透明的方式來(lái)訪問(wèn)設(shè)備文件系統(tǒng)上的常用位置。該類(lèi)當(dāng)前支持訪問(wèn)兩個(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è)專(zhuān)門(mén)的類(lèi)型叫做Uint8List,他實(shí)際上表示的是一個(gè)int的List。
上面提到的讀取方式,都是一次性讀取整個(gè)文件,缺點(diǎn)就是如果文件太大的話,可能造成內(nèi)存空間的壓力。
所以File為我們提供了另外一種讀取文件的方法,流的形式來(lái)讀取文件.
示例
dart提供了open和openSync兩個(gè)方法來(lái)進(jìn)行隨機(jī)文件讀寫(xiě):
寫(xiě)入和文件讀取一樣,可以一次性寫(xiě)入或者獲得一個(gè)寫(xiě)入句柄,然后再寫(xiě)入。
一次性寫(xiě)入的方法有四種,分別對(duì)應(yīng)字符串和二進(jìn)制
句柄形式可以調(diào)用openWrite方法,返回一個(gè)IOSink對(duì)象,然后通過(guò)這個(gè)對(duì)象進(jìn)行寫(xiě)入:
默認(rèn)情況下寫(xiě)入是會(huì)覆蓋整個(gè)文件的,但是可以通過(guò)下面的方式來(lái)更改寫(xiě)入模式:
雖然dart中所有的異常都是運(yùn)行時(shí)異常,但是和java一樣,要想手動(dòng)處理文件讀寫(xiě)中的異常,則可以使用try,catch:
我們還是以計(jì)數(shù)器為例,實(shí)現(xiàn)在應(yīng)用退出重啟后可以恢復(fù)點(diǎn)擊次數(shù)。 這里,我們使用文件來(lái)保存數(shù)據(jù):
1.引入PathProvider插件;在pubspec.yaml文件中添加如下聲明:
執(zhí)行 flutter pub get
2.實(shí)現(xiàn)如下
參考:
細(xì)心的開(kāi)發(fā)者會(huì)發(fā)現(xiàn)flutter構(gòu)建的App體積比native的大一些,是什么原因造成App體積大呢?
其實(shí)flutter 在release時(shí)App體積和native的大小差不多,而debug時(shí)體積通常會(huì)大。debug版本體積較大是為了Hot reload和快速編譯。如果有flutter開(kāi)發(fā)經(jīng)驗(yàn)的朋友都體驗(yàn)過(guò),如果您修改一下App的背景顏色,只需save一下就可以立刻看到修改后效果。我稱(chēng)之為“像藝術(shù)家一樣在創(chuàng)造App”,因此為了實(shí)現(xiàn)這些目標(biāo),提高開(kāi)發(fā)的效率,debug將占用全部資源。而當(dāng)我們構(gòu)建release版時(shí),flutter又會(huì)采用AOT策略,提高App運(yùn)行效率,release版只打包必需的資源,因而體積又會(huì)減少。
另外,flutter團(tuán)隊(duì)也一直在尋找減小程序大小的方法。
Flutter可以算是當(dāng)下最火熱的新技術(shù)之一,我現(xiàn)在所在團(tuán)隊(duì)也準(zhǔn)備將Flutter技術(shù)應(yīng)用到線上工程中。
關(guān)于混合工程,官方文檔其實(shí)寫(xiě)的已經(jīng)比較清楚了,按著文檔走一般問(wèn)題不大,
但是有一點(diǎn)值得注意的是,F(xiàn)lutter工程引入的庫(kù)的gradle的 buildTypes 要與原工程保持一致,如果不一致需要手工添加。
進(jìn)入正題,現(xiàn)在Flutter官方默認(rèn)只提供armeabi-v7a、arm64-v8a、x86和x86-64,其中x86和x86-64是為模擬器準(zhǔn)備的。目前我們使用的SDK大部分只使用了armeabi架構(gòu),直接使用我們會(huì)遇見(jiàn)找不到 libflutter.so,libapp.so 的情況,所以我們需要對(duì)FlutterSDK做一定的改造。
首先我們要了解下Flutter編譯產(chǎn)物,因?yàn)椴煌姹井a(chǎn)物是不同的,這里我們只針對(duì)Flutter 1.9.1-hotfixes來(lái)說(shuō)。除了資源文件之外,F(xiàn)lutter打包會(huì)生成兩個(gè)非常重要的so庫(kù),他們分別是 libflutter.so,libapp.so 。其中 libflutter.so 是Flutter的SDK產(chǎn)物而 libapp.so 正是我們編寫(xiě)的dart文件的產(chǎn)物。默認(rèn)情況下,這兩個(gè)文件都會(huì)出現(xiàn)在armeabi-v7a中,因此我們要作出對(duì)應(yīng)的改造。
libflutter.so 位于FlutterSDK中,這里順帶提一句,除了這對(duì)不同CPU架構(gòu),它還分為Debug版和Release版,它們的區(qū)別在于Debug是為JIT編譯方式打造的,體積較大而Release是為AOT編譯方式打造的,體積很小。對(duì) libflutter.so 的改造,只要將其移動(dòng)文件路徑即可,運(yùn)行以下腳本即可,此腳本來(lái)自美團(tuán)分享的Flutter文章。
移動(dòng)完了 libflutter.so 之后我們打包發(fā)現(xiàn), libapp.so 仍然會(huì)出現(xiàn)在armeabi-v7a中,所以第二部我們就是移動(dòng) libapp.so 。這個(gè)需要更改 flutter.gradle ,我們?cè)?flutter.gradle 的45行可以看到如下定義,它定義了我們的環(huán)境。
在524行我們可以看到,abiValue的取值就是根據(jù)上述定義值。
所以結(jié)論很簡(jiǎn)單,只要將
private static final String ARCH_ARM32 = "armeabi-v7a";
改為
private static final String ARCH_ARM32 = "armeabi";
就可以完成對(duì)與 libflutter.so 的移動(dòng)。
前期工作我們都做好了,打成aar就非常簡(jiǎn)單了
直接使用 flutter build aar --target-platform android-arm
打出來(lái)后可以解壓檢查下 libflutter.so,libapp.so 是否都在armeabi文件夾下即可。
說(shuō)完了armeabi適配問(wèn)題,這里下說(shuō)下有關(guān)于有關(guān)于FlutterBoost的接入。這個(gè)東西接入有兩點(diǎn)要注意。
在主app內(nèi)加上即可,常規(guī)操作,強(qiáng)制統(tǒng)一support包的版本號(hào)
注釋flutter.gradle第655行。因?yàn)榫幾g過(guò)程中,會(huì)去初始化插件項(xiàng)目的buildType下面的debug配置,而插件項(xiàng)目下并未配置debug,導(dǎo)致報(bào)錯(cuò)。
如果發(fā)現(xiàn)文章中有錯(cuò)誤或者有更好的解決方案歡迎指正留言,當(dāng)然如果本篇文章幫助你解決了問(wèn)題,也不要吝嗇你的感謝。謝謝各位。
Flutter 項(xiàng)目雖說(shuō)是跨平臺(tái)項(xiàng)目,但是項(xiàng)目的名稱(chēng)還是需要在不同的平臺(tái)設(shè)置,不同平臺(tái)的設(shè)置位置是:
1、 Android 項(xiàng)目名字配置是在 android/app/src/main/AndroidManifest.xml 文件中的 application 下的 android:label 。如下圖所示:
2、 iOS 項(xiàng)目名字配置是在 ios/Runner/Info.plist 文件中的 dict 下的 keyCFBundleName/key stringtestapp/string 。如下圖所示:
Flutter 項(xiàng)目雖說(shuō)是跨平臺(tái)項(xiàng)目,但是項(xiàng)目的 Logo 圖標(biāo)還是需要在不同的平臺(tái)設(shè)置,不同平臺(tái)的設(shè)置位置是:
1、 Android 項(xiàng)目 Logo 配置是在圖片放置在 android/app/src/main/res 下的對(duì)應(yīng)目錄下:
mipmap-mdpi : 48 _ 48
mipmap-hdpi : 72 _ 72
mipmap-xhdpi :96 _ 96
mipmap-xxhdpi :144 _ 144
mipmap-xxxhdpi :192 * 192。如下圖所示:
然后,在 android/app/src/main/AndroidManifest.xml 路徑下的 AndroidManifest.xml 文件中的 android:icon 。如下圖所示:
2、 iOS 項(xiàng)目 Logo 的配置是在 ios/Runner/Assets.xcassets/AppIcon.appiconset 文件下,直接更換圖片,名字不要改動(dòng) 。如下圖所示:
1、使用 cd 指令進(jìn)入項(xiàng)目(testapp)的根目錄(方便后面操作),如下圖所示:
填寫(xiě)對(duì)應(yīng)的值,如下圖所示:
1、 build.gradle 文件的位置,如下圖所示:
2、在 build.gradle 中配置 key.propreties 的全局變量,
如下圖所示:
3、 build.gradle 文件中進(jìn)行簽名配置。
如下圖所示:
注意: buildTypes 中的 signingConfig signingConfigs.debug 可以變更為 signingConfig signingConfigs.release ,這樣在打包的時(shí)候,直接可以 flutter build apk ,否則就執(zhí)行 flutter build apk --release 。如圖所示:
1、 cd 進(jìn)入功能(testapp) 的根目錄,如下圖所示:
2、執(zhí)行 flutter build apk 指令,如下圖所示:
我們打包成功, 生成的 apk 包在 build/app/outputs/apk/release/app-release.apk 目錄下,如下圖所示:
1、將真機(jī)通過(guò) USB 鏈接到電腦上,如下圖所示:
2、然后,在項(xiàng)目的根目錄執(zhí)行 flutter install , 如果出現(xiàn)電腦同時(shí)有多個(gè)設(shè)備時(shí),就執(zhí)行 flutter install -d deviceid 。如下圖所示:
3、設(shè)備的安裝過(guò)程如下:
1、必須一個(gè) Xcode 開(kāi)發(fā)工具
2、如果是 Window 的電腦,請(qǐng)安裝 Mac 虛擬系統(tǒng),進(jìn)行安裝 Xcode .
1、打開(kāi)目錄下的 Runner.xcworkspace 工程。
如下圖所示:
2、在 ios 工程中配置 Signing Capabilities , 如下圖所示:
1、進(jìn)入項(xiàng)目的根目錄
2、打包指令 flutter build ios --release
如圖所示:
3、使用 Xcode 工具進(jìn)行打包
如圖所示:
注意:進(jìn)行該步驟,必須執(zhí)行 flutter build ios --release 否則會(huì)報(bào)錯(cuò)。
打包成功,如下圖所示:
國(guó)外地址:
國(guó)內(nèi)鏡像:
以 flutter_screenutil 為例
路由框架 annotation_route
狀態(tài)管理 provider
UI適配 flutter_screenutil
刷新控件 flutter_easyrefresh
網(wǎng)絡(luò)請(qǐng)求 dio
toast控件 fluttertoast
圖表庫(kù) charts_flutter
網(wǎng)絡(luò)監(jiān)聽(tīng) connectivity
事件總線 event_bus
日歷組件 table_calendar
官方webview webview_flutter
第三方webview flutter_webview_plugin
該篇文章為常用依賴(lài)包總結(jié),用來(lái)記錄所需要的常用依賴(lài)包,后續(xù)會(huì)不斷擴(kuò)充內(nèi)容~