如下,
創(chuàng)新互聯(lián)公司長期為成百上千客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為株洲企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站制作,株洲網(wǎng)站改版等技術服務。擁有10多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
當你添加完所有環(huán)境變量,或者多次卸掉重裝android studio后,再次插入手機,或者是開啟模擬器的時候,vscode或android studio都顯示no devices的時候,以下簡單的解決方法或許能幫到你。
1、先檢查自己以往是否有安裝adb。在cmd中查看adb的版本。輸入:adb version。
2、如果有安裝的話,建議在C:WindowsSystem和C:WindowsSystem32刪除adb.exe, AdbWinApi.dll和AdbWinUsbApi.dll三個文件即可。
3、你在android studio經(jīng)過了一頓操作,例如安裝了一系列的sdk文件,還有創(chuàng)建了模擬器之后,也執(zhí)行了第二步,環(huán)境變量也設置好了,在cmd中輸入adb version。
這就代表了你已經(jīng)徹底清除了舊版本的adb,用的是目前最新版本的adb。這個也會隨著flutter upgrade的更新而更新。我今天更新了flutter版本,adb應該是最新的。
4、在管理員模式下打開cmd,輸入adb devices,會看見當前已經(jīng)打開了的安卓設備。
5、輸入adb connect 你安卓設備的名字 。我的安卓設備名字是4ad32643。所以我就輸入adb connect 4ad32543。
failed那一行不用管,這時候看回vscode或者是android studio,即會出現(xiàn)設備,可進行flutter的正常調(diào)試。
path_provider是flutter提供的一個獲取應用存儲路徑的插件,它封裝了統(tǒng)一的api來獲取Android和ios兩個平臺的應用存儲路徑,提供的api如下:
getTemporaryDirectory():獲取應用臨時文件夾,該文件夾用來保存應用的緩存,可以隨時刪除用于清緩存,對應于Android的getCacheDir()和ios的NSTemporaryDirectory();
getApplicationDocumentsDirectory():獲取應用安裝路徑,在應用被卸載的時候刪除,對應Android的AppDate目錄和iOS的NSDocumentDirectory目錄;
getExternalStorageDirectory():獲取存儲卡目錄,僅支持Android;
我們通過File和Directory來創(chuàng)建文件和文件夾時首先要獲取到應用的相關路徑,不然會報錯;
File對象和Directory對象封裝在dart:io中,使用時需要先引入該庫:
Directory對象提供listSync()方法獲取文件夾里的內(nèi)容,該方法返回一個數(shù)組;
文件和文件夾都通過delete刪除,delete異步,deleteSync同步;如果一個文件夾是非空的刪除會報錯,刪除非空文件夾需要先清空該文件夾:
flutter對json序列化需要引入 dart:convert 庫:
通過jsonEncode/jsonDecode來轉(zhuǎn)換json對象:
// 將test目錄下的info.json復制到test2目錄下的info2.json中
引入包archive包:
壓縮:
壓縮前使用ZipFileEncoder先聲明處理壓縮的對象,調(diào)用該對象的zipDirectory方法壓縮文件,該方法接受兩個參數(shù),第一個是要壓縮文件/文件夾的路徑,第二個是壓縮包的保存路徑;
解壓:
Flutter有兩個常用的狀態(tài)類:
標記為dirty,執(zhí)行的markNeedsBuild,定義在Element類中:
當前Element節(jié)點被標記為dirty,同時調(diào)用owner的scheduleBuildFor方法:
將element元素添加到全局的“臟”鏈表里。
BuildOwner用來管理哪些需要更新的Widget。這個owner最開始被初始化的地方在WidgetsBinding的initInstances方法中,隨后初始化了onBuildScheduled方法,對應執(zhí)行的是_handleBuildScheduled,定義在WidgetsBinding類中:
ensureVisualUpdate 方法定義在SchedulerBinding類中:
在提交下一幀繪制的時候會調(diào)用到scheduleFrame方法,提交給引擎繪制,看看scheduleFrame方法,也定義在SchedulerBinding類中:
提交給引擎繪制之后,會收到onDrawFrame的回調(diào),最終執(zhí)行到_handleDrawFrame方法中,對應的是handleDrawFrame方法,定義在SchedulerBinding類中:
在RendererBinding的initInstances方法中添加了一個回調(diào)到這個List中,對應的是RenderBinding的drawFrame方法,對應的節(jié)點進行繪制渲染操作。
WidgetsBinding中的drawFrame方法:
看看這里的buildScope方法,定義在BuildOwner方法中。在上面 scheduleBuildFor 方法介紹中有提到:"scheduleBuildFor 是把一個 element 添加到 _dirtyElements 鏈表,以便當[WidgetsBinding.drawFrame]中調(diào)用 buildScope 的時候能夠重構(gòu) element。onBuildScheduled()是一個 BuildOwner 的回調(diào)"。在 drawFrame 中調(diào)用 buildOwner.buildScope(renderViewElement)更新 elements。
_dirtyElements列表在遍歷的過程中執(zhí)行rebuild方法,此時將所有標記為dirty的Element節(jié)點依次執(zhí)行rebuild,preformRebuild,build,updateChild,update方法,執(zhí)行界面更新。完成build,update操作完成之后,后續(xù)會將需要繪制的RenderObject添加到需要layout的列表中,等待繪制渲染。所有繪制完成之后將_dirtyElments列表清空,_inDirtyList標記位置為false。
提交給引擎繪制渲染
看看super.drawFrame(),這里就執(zhí)行到了RendererBinding類中,定義如下:
這里就是將最終需要繪制渲染的畫面提交給引擎的地方了,繪制完成之后就在界面顯示更新后的視圖了。