真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

flutter用戶跟蹤,flutter 監(jiān)聽(tīng)

Flutter進(jìn)階篇(4)-- Flutter的Future異步詳解

本文首發(fā)在公眾號(hào) Flutter那些事 ,歡迎大家多多關(guān)注。

創(chuàng)新互聯(lián)是專業(yè)的蕪湖縣網(wǎng)站建設(shè)公司,蕪湖縣接單;提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行蕪湖縣網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

工具安裝:

Flutter基礎(chǔ)篇:

Flutter進(jìn)階篇:

Dart語(yǔ)法基礎(chǔ)篇:

Dart語(yǔ)法進(jìn)階篇:

說(shuō)明:本文中的所有函數(shù)的引用在 main 函數(shù)中:

這里的執(zhí)行結(jié)果是:

Futue直接new就可以了。我這里沒(méi)有具體的返回?cái)?shù)據(jù),所以就用匿名函數(shù)代替了, Future future = new Future(() = null); 相當(dāng)于 FutureNull future = new Future(() = null); 泛型如果為null可以省略不寫,為了便于維護(hù)和管理,開(kāi)發(fā)中建議加上泛型。

輸出結(jié)果是:

future里面有幾個(gè)函數(shù):

then :異步操作邏輯在這里寫。

whenComplete :異步完成時(shí)的回調(diào)。

catchError :捕獲異常或者異步出錯(cuò)時(shí)的回調(diào)。

因?yàn)檫@里面的異步操作過(guò)程中沒(méi)有遇到什么錯(cuò)誤,所以catchError回調(diào)不會(huì)調(diào)用。

我們可以看到執(zhí)行結(jié)果是:

我們可以看到輸出結(jié)果是: 2 1 3 和我們創(chuàng)建Future對(duì)象的先后順序完全一致。

我們可以看到結(jié)果為 1 2 3 ,和我們調(diào)用then的先后順序無(wú)關(guān)。:

當(dāng)then回調(diào)函數(shù)里面還有then回調(diào)的時(shí)候,這時(shí)候的流程跟前面就不太一樣了,也是一個(gè)大坑,也是面試經(jīng)常會(huì)被問(wèn)到的一個(gè)知識(shí)點(diǎn)。

我們可以看到執(zhí)行結(jié)果如下:

結(jié)果還是一樣的:

運(yùn)行結(jié)果是:

這里再次證明了上面我的猜想: 執(zhí)行順序和和創(chuàng)建Future的先后順序有關(guān),如果有多個(gè)then嵌套執(zhí)行,先執(zhí)行外面的then,然后執(zhí)行里面的then。

執(zhí)行結(jié)果如下,我們可以看到then內(nèi)部創(chuàng)建的Future要等到then執(zhí)行完了,最后再去執(zhí)行的:

根據(jù)上文總結(jié)的特點(diǎn),我們可以不用運(yùn)行也能推斷出輸出結(jié)果:

為了驗(yàn)證我們的猜想,我們打印一下輸出結(jié)果,果然我們的證明是正確的。

我們重點(diǎn)看看 then函數(shù)的文檔說(shuō)明:

then 注冊(cè)在 Future 完成時(shí)調(diào)用的回調(diào)。

當(dāng)這個(gè) Future 用一個(gè) value 完成時(shí),將使用該值調(diào)用 onValue 回調(diào)。

如果 Future 已經(jīng)完成,則不會(huì)立即調(diào)用回調(diào),而是將在稍后的 microtask(微任務(wù)) 中調(diào)度。

如果回調(diào)返回 Future ,那么 then 返回的 future 將與 callback 返回的 future 結(jié)果相同。

onError 回調(diào)必須接受一個(gè)參數(shù)或兩個(gè)參數(shù),后者是[StackTrace]。

如果 onError 接受兩個(gè)參數(shù),則使用錯(cuò)誤和堆棧跟蹤時(shí)調(diào)用它,否則僅使用錯(cuò)誤對(duì)象時(shí)候調(diào)用它。

onError 回調(diào)必須返回一個(gè)可用于完成返回的future的值或future,因此它必須是可賦值給 FutureOr R 的東西。

返回一個(gè)新的 Future ,該 Future 是通過(guò)調(diào)用 onValue (如果這個(gè)Future是通過(guò)一個(gè)value完成的)或' onError (如果這個(gè)Future是通過(guò)一個(gè)error完成的)的結(jié)果完成的。

如果調(diào)用的回調(diào)拋出異常,返回的 future 將使用拋出的錯(cuò)誤和錯(cuò)誤的堆棧跟蹤完成。在 onError 的情況下,如果拋出的異常與 onError 的錯(cuò)誤參數(shù)“相同(identical)”,則視為重新拋出,并使用原始堆棧跟蹤替代

如果回調(diào)返回 Future ,則 then 返回的 Future 將以與回調(diào)返回的 Future 相同的結(jié)果完成。

如果未給出 onError ,并且后續(xù)程序走了剛出現(xiàn)了錯(cuò)誤,則錯(cuò)誤將直接轉(zhuǎn)發(fā)給返回的 Future 。

在大多數(shù)情況下,單獨(dú)使用 catchError 更可讀,可能使用 test 參數(shù),而不是在單個(gè) then 調(diào)用中同時(shí)處理 value 和 error 。

請(qǐng)注意,在添加監(jiān)聽(tīng)器(listener)之前, future 不會(huì)延遲報(bào)告錯(cuò)誤。如果第一個(gè) then 或 catchError 調(diào)用在 future 完成后發(fā)生 error ,那么 error 將報(bào)告為未處理的錯(cuò)誤。

Flutter跨平臺(tái)框架(Dart語(yǔ)言)

Flutter是谷歌的移動(dòng)UI框架,可以快速在iOS和Android上構(gòu)建高質(zhì)量的原生用戶界面。 Flutter可以與現(xiàn)有的代碼一起工作。在全世界,F(xiàn)lutter正在被越來(lái)越多的開(kāi)發(fā)者和組織使用,并且Flutter是完全免費(fèi)、開(kāi)源的。(-中文網(wǎng);-英文網(wǎng))

Flutter是一種趨勢(shì),勢(shì)必會(huì)取代RN,成為最主流的跨平臺(tái)開(kāi)發(fā)框架,基于Dart語(yǔ)言。ios開(kāi)發(fā)必須Mac電腦。android開(kāi)發(fā)window、linux、Mac均可。

Flutter真香,我用它寫了個(gè)桌面版JSON解析工具

Flutter支持穩(wěn)定的桌面設(shè)備開(kāi)發(fā)已經(jīng)一段時(shí)間了,不得不說(shuō),F(xiàn)lutter多平臺(tái)支持的特性真的很香。我本人并沒(méi)有任何桌面開(kāi)發(fā)的經(jīng)驗(yàn),但仍然使用Flutter開(kāi)發(fā)出了一個(gè)桌面版小程序,功能很簡(jiǎn)單,就是對(duì)輸入的json做格式化處理和轉(zhuǎn)模型。

話不多說(shuō),先來(lái)看看實(shí)際效果。 項(xiàng)目源碼地址

開(kāi)發(fā)環(huán)境如下:

Flutter : 2.8.1

Dart : 2.15.1

IDE : VSCode

JSON作為我們?nèi)粘i_(kāi)發(fā)工作中經(jīng)常要打交道的一種數(shù)據(jù)格式,它共有6種數(shù)據(jù)類型: null , num , string , object , array , bool 。我們勢(shì)必對(duì)它又愛(ài)又恨。愛(ài)他因?yàn)樗鳛閿?shù)據(jù)處理的一種格式確實(shí)非常方便簡(jiǎn)潔。但是在我們做Flutter開(kāi)發(fā)中,又需要接觸到j(luò)son解析時(shí),就會(huì)感覺(jué)非常棘手,因?yàn)閒lutter沒(méi)有反射,導(dǎo)致json轉(zhuǎn)模型這塊需要手寫那繁雜的映射關(guān)系。就像下面這樣子。

數(shù)據(jù)量少還能接受,一旦量大,那么光手寫這個(gè)解析方法都能讓你懷疑人生。更何況手寫還有出錯(cuò)的可能。好在官方有個(gè)工具**json_serializable**可以自動(dòng)生成這塊轉(zhuǎn)換代碼,也解決了flutter界json轉(zhuǎn)模型的空缺。當(dāng)然,業(yè)界也有專門解析json的網(wǎng)站,可以自動(dòng)生成dart代碼,使用者在生成后復(fù)制進(jìn)項(xiàng)目中即可,也是非常方便的。

本項(xiàng)目以json解析為切入點(diǎn),和大家一起來(lái)看下flutter是如何開(kāi)發(fā)桌面應(yīng)用的。

要讓我們的flutter項(xiàng)目支持桌面設(shè)備。我們首先需要修改下flutter的設(shè)置。如下,讓我們的項(xiàng)目支持 windows 和 macos 系統(tǒng)。

接下來(lái)使用 flutter create 命令創(chuàng)建我們的模版工程。

創(chuàng)建完項(xiàng)目后,我們就可以 run 起來(lái)了。

先來(lái)看下整體界面,界面四塊,分別為功能模塊、文件選擇模塊、輸入模塊、輸出模塊。

我們?cè)谛陆ㄒ粋€(gè)桌面應(yīng)用時(shí),默認(rèn)的模版又一個(gè)Appbar,此時(shí)應(yīng)用可以用鼠標(biāo)拖拽移動(dòng),放大縮小,還可以縮到很小。但是,我們一旦去掉這個(gè)導(dǎo)航欄,那么窗口就不能用鼠標(biāo)拖動(dòng)了,并且我們往往不希望用戶將我們的窗口縮放的很小,這會(huì)導(dǎo)致頁(yè)面異常,一些重要信息都展示不全。因此這里需要借助第三方組件 bitsdojo_window 。通過(guò) bitsdojo_window ,我們可以實(shí)現(xiàn)窗口的定制化,拖動(dòng),最小尺寸,最大尺寸,窗口邊框,窗口頂部放大、縮小、關(guān)閉的按鈕等。

通過(guò) InkWell 組件,可以捕捉到手勢(shì)、鼠標(biāo)、觸控筆的移動(dòng)和停留位置

這個(gè)功能是鼠標(biāo)移動(dòng)后的UI交互界面。要在窗口上顯示一個(gè)提示框,可以使用 Overlay 。需要注意的是,由于在 Overlay 上的 text 的根結(jié)點(diǎn)不是 Material 風(fēng)格的組件,因此會(huì)出現(xiàn)黃色的下劃線。因此一定要用 Material 包一下 text 。并且你必須給創(chuàng)建的 OverlayEntry 一個(gè)位置,否則它將全屏顯示。

讀取說(shuō)表拖拽的文件一開(kāi)始想嘗試使用 InkWell 組件,但是這個(gè)組件無(wú)法識(shí)別拖拽中的鼠標(biāo),并且也無(wú)法從中拿到文件信息。因此放棄。后來(lái)從文章《Flutter-2天寫個(gè)桌面端APP》中發(fā)現(xiàn)一個(gè)可讀取拖拽文件的組件 desktop_drop ,能滿足要求。

使用開(kāi)源組件 file_picker ,選完圖片后的操作和拖拽選擇圖片后的操作一致。

Textfield 如果要顯示富文本,那么需要自定義 TextEditingController 。并重寫 buildTextSpan 方法。

在做導(dǎo)出功能時(shí)遇到下列報(bào)錯(cuò),保存提示為沒(méi)有權(quán)限訪問(wèn)對(duì)應(yīng)目錄下的文件。

通過(guò)Apple的開(kāi)發(fā)文檔找到有關(guān)權(quán)限問(wèn)題的說(shuō)明。其中有個(gè)授權(quán)私鑰的key為 com.apple.security.files.downloads.read-write ,表示 對(duì)用戶的下載文件夾的讀/寫訪問(wèn)權(quán)限 。那么,使用Xcode打開(kāi)Flutter項(xiàng)目中的mac應(yīng)用,修改工程目錄下的 DebugProfile.entitlements 文件,向 entitlements 文件中添加 com.apple.security.files.downloads.read-write ,并將值設(shè)置為YES,保存后重啟Flutter項(xiàng)目。發(fā)現(xiàn)已經(jīng)可以向下載目錄中讀寫文件了。

當(dāng)然,這是正常操作。還有個(gè)騷操作就是關(guān)閉系統(tǒng)的沙盒機(jī)制。將 entitlements 文件的 App Sandbox 設(shè)置為NO。這樣我們就可以訪問(wèn)任意路徑了。當(dāng)然關(guān)閉應(yīng)用的沙盒也就相當(dāng)于關(guān)閉了應(yīng)用的防護(hù)機(jī)制,因此這個(gè)選項(xiàng)慎用。

原文地址:


文章標(biāo)題:flutter用戶跟蹤,flutter 監(jiān)聽(tīng)
文章鏈接:http://weahome.cn/article/hoedjo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部