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