内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

flutter動(dòng)態(tài)map,Flutter動(dòng)態(tài)放大縮小布局

Flutter 小技巧之優(yōu)化你使用的 BuildContext

Flutter 里的 BuildContext 相信大家都不會(huì)陌生,雖然它叫 Context,但是它實(shí)際是 Element 的抽象對(duì)象,而在 Flutter 里,它主要來(lái)自于 ComponentElement 。

創(chuàng)新互聯(lián)建站專(zhuān)注于北辰企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),商城網(wǎng)站建設(shè)。北辰網(wǎng)站建設(shè)公司,為北辰等地區(qū)提供建站服務(wù)。全流程按需規(guī)劃網(wǎng)站,專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)

關(guān)于 ComponentElement 可以簡(jiǎn)單介紹一下,在 Flutter 里根據(jù) Element 可以簡(jiǎn)單地被歸納為兩類(lèi):

所以一般情況下,我們?cè)? build 方法或者 State 里獲取到的 BuildContext 其實(shí)就是 ComponentElement 。

那使用 BuildContext 有什么需要注意的問(wèn)題 ?

首先如下代碼所示,在該例子里當(dāng)用戶點(diǎn)擊 FloatingActionButton 的時(shí)候,代碼里做了一個(gè) 2秒的延遲,然后才調(diào)用 pop 退出當(dāng)前頁(yè)面。

正常情況下是不會(huì)有什么問(wèn)題,但是當(dāng)用戶在點(diǎn)擊了 FloatingActionButton 之后,又馬上點(diǎn)擊了 AppBar 返回退出應(yīng)用,這時(shí)候就會(huì)出現(xiàn)以下的錯(cuò)誤提示。

可以看到此時(shí) log 說(shuō),Widget 對(duì)應(yīng)的 Element 已經(jīng)不在了,因?yàn)樵? Navigator.of(context) 被調(diào)用時(shí), context 對(duì)應(yīng)的 Element 已經(jīng)隨著我們的退出銷(xiāo)毀。

一般情況下處理這個(gè)問(wèn)題也很簡(jiǎn)單, 那就是增加 mounted 判斷,通過(guò) mounted 判斷就可以避免上述的錯(cuò)誤 。

上面代碼里的 mounted 標(biāo)識(shí)位來(lái)自于 State , 因?yàn)? State 是依附于 Element 創(chuàng)建,所以它可以感知 Element 的生命周期 ,例如 mounted 就是判斷 _element != null; 。

那么到這里我們收獲了一個(gè)小技巧: 使用 BuildContext 時(shí),在必須時(shí)我們需要通過(guò) mounted 來(lái)保證它的有效性 。

那么單純使用 mounted 就可以滿足 context 優(yōu)化的要求了嗎 ?

如下代碼所示,在這個(gè)例子里:

由于在 5 秒之內(nèi),Item 被劃出了屏幕,所以對(duì)應(yīng)的 Elment 其實(shí)是被釋放了,從而由于 mounted 判斷, SnackBar 不會(huì)被彈出。

那如果假設(shè)需要在開(kāi)發(fā)時(shí)展示點(diǎn)擊數(shù)據(jù)上報(bào)的結(jié)果,也就是 Item 被釋放了還需要彈出,這時(shí)候需要如何處理 ?

我們知道不管是 ScaffoldMessenger.of(context) 還是 Navigator.of(context) ,它本質(zhì)還是通過(guò) context 去往上查找對(duì)應(yīng)的 InheritedWidget 泛型,所以其實(shí)我們可以提前獲取。

所以,如下代碼所示,在 Future.delayed 之前我們就通過(guò) ScaffoldMessenger.of(context); 獲取到 sm 對(duì)象,之后就算你直接退出當(dāng)前的列表頁(yè)面,5秒過(guò)后 SnackBar 也能正常彈出。

為什么頁(yè)面銷(xiāo)毀了,但是 SnackBar 還能正常彈出 ?

因?yàn)榇藭r(shí)通過(guò) of(context); 獲取到的 ScaffoldMessenger 是存在 MaterialApp 里,所以就算頁(yè)面銷(xiāo)毀了也不影響 SnackBar 的執(zhí)行。

但是如果我們修改例子,如下代碼所示,在 Scaffold 上面多嵌套一個(gè) ScaffoldMessenger ,這時(shí)候在 Item 里通過(guò) ScaffoldMessenger.of(context) 獲取到的就會(huì)是當(dāng)前頁(yè)面下的 ScaffoldMessenger 。

這種情況下我們只能保證Item 不可見(jiàn)的時(shí)候 SnackBar 還能正常彈出, 而如果這時(shí)候我們直接退出頁(yè)面,還是會(huì)出現(xiàn)以下的錯(cuò)誤提示,因?yàn)? ScaffoldMessenger 也被銷(xiāo)毀了 。

所以到這里我們收獲第二個(gè)小技巧: 在異步操作里使用 of(context) ,可以提前獲取,之后再做異步操作,這樣可以盡量保證流程可以完整執(zhí)行 。

既然我們說(shuō)到通過(guò) of(context) 去獲取上層共享往下共享的 InheritedWidget ,那在哪里獲取就比較好 ?

還記得前面的 log 嗎?在第一個(gè)例子出錯(cuò)時(shí),log 里就提示了一個(gè)方法,也就是 State 的 didChangeDependencies 方法。

為什么是官方會(huì)建議在這個(gè)方法里去調(diào)用 of(context) ?

首先前面我們一直說(shuō),通過(guò) of(context) 獲取到的是 InheritedWidget ,而 當(dāng) InheritedWidget 發(fā)生改變時(shí),就是通過(guò)觸發(fā)綁定過(guò)的 Element 里 State 的 didChangeDependencies 來(lái)觸發(fā)更新, 所以在 didChangeDependencies 里調(diào)用 of(context) 有較好的因果關(guān)系 。

那我能在 initState 里提前調(diào)用嗎 ?

當(dāng)然不行,首先如果在 initState 直接調(diào)用如 ScaffoldMessenger.of(context).showSnackBar 方法,就會(huì)看到以下的錯(cuò)誤提示。

這是因?yàn)?Element 里會(huì)判斷此時(shí)的 _StateLifecycle 狀態(tài),如果此時(shí)是 _StateLifecycle.created 或者 _StateLifecycle.defunct ,也就是在 initState 和 dispose ,是不允許執(zhí)行 of(context) 操作。

當(dāng)然,如果你硬是想在 initState 下調(diào)用也行,增加一個(gè) Future 執(zhí)行就可以成功執(zhí)行

那我在 build 里直接調(diào)用不行嗎 ?

直接在 build 里調(diào)用肯定可以,雖然 build 會(huì)被比較頻繁執(zhí)行,但是 of(context) 操作其實(shí)就是在一個(gè) map 里通過(guò) key - value 獲取泛型對(duì)象,所以對(duì)性能不會(huì)有太大的影響。

真正對(duì)性能有影響的是 of(context) 的綁定數(shù)量和獲取到對(duì)象之后的自定義邏輯 ,例如你通過(guò) MediaQuery.of(context).size 獲取到屏幕大小之后,通過(guò)一系列復(fù)雜計(jì)算來(lái)定位你的控件。

例如上面這段代碼,可能會(huì)導(dǎo)致鍵盤(pán)在彈出的時(shí)候,雖然當(dāng)前頁(yè)面并沒(méi)有完全展示,但是也會(huì)導(dǎo)致你的控件不斷重新計(jì)算從而出現(xiàn)卡頓。

所以到這里我們又收獲了一個(gè)小技巧: 對(duì)于 of(context) 的相關(guān)操作邏輯,可以盡量放到 didChangeDependencies 里去處理 。

flutter 第三方地圖導(dǎo)航實(shí)現(xiàn)

這里實(shí)現(xiàn)flutter第三方地圖導(dǎo)航,選用最簡(jiǎn)單的方式--調(diào)用第三方地圖客戶端;但各種地圖客戶端用的坐標(biāo)系不一定相同,先了解下常見(jiàn)的坐標(biāo)系:

地圖應(yīng)用api坐標(biāo)系:

在 pubspec.yaml 文件中添加依賴插件:

一般android和ios調(diào)起第三方應(yīng)用是通過(guò)scheme方式,這里調(diào)起第三方地圖客戶端導(dǎo)航也一樣,如高德地圖,ios scheme為iosamap,android scheme為androidamap; 所以flutter需要引用url_launcher;

未完待續(xù)~~

Flutter筆記-調(diào)用原生IOS高德地圖sdk

2017年底因公司業(yè)務(wù)組合部門(mén)調(diào)整,新的團(tuán)隊(duì)部分維護(hù)的項(xiàng)目用React Native技術(shù)混合開(kāi)發(fā)。為適應(yīng)環(huán)境變化,開(kāi)啟瘋狂RN學(xué)習(xí)之旅,晚上回來(lái)啃資料看視頻。可能由于本身對(duì)RN技術(shù)體驗(yàn)不感冒或者在環(huán)境之下強(qiáng)迫學(xué)習(xí)有點(diǎn)不爽。開(kāi)始尋找代替方案,F(xiàn)luter像一束曙光引起了我的注意,之后一直關(guān)注并利用閑余時(shí)間開(kāi)始探索。2018年一直學(xué)習(xí)到使用Flutter寫(xiě)項(xiàng)目,從0.2.0開(kāi)始到現(xiàn)在1.5版本的發(fā)布,終于開(kāi)始慢慢的爬出坑位了,但是因?yàn)椴糠挚丶杏X(jué)還是不如原生控件好用,因而Flutter提供了PlatformView部件。近期因項(xiàng)目中嚴(yán)重使用依賴地圖,故而做了Fluterr使用原生IOS高德地圖調(diào)研。因?yàn)槲冶旧硎且幻鸻ndroid開(kāi)發(fā)人員,初學(xué)IOS并記錄下來(lái)。

PlatformView是 flutter 官方提供的一個(gè)可以嵌入 Android 和 iOS 平臺(tái)原生 view 的小部件。

在我們實(shí)際開(kāi)發(fā)中,我們遇到一些 flutter 官方?jīng)]有提供的插件可以自己創(chuàng)建編寫(xiě)插件來(lái)實(shí)現(xiàn)部分功能,但是原生View在 flutter 中會(huì)遮擋住flutter 中的小部件,比如你想使用高德地圖sdk、視頻播放器、直播等原生控件,就無(wú)法很好的與 flutter 項(xiàng)目結(jié)合。

1、info.plist文件設(shè)置

2、 ios 端實(shí)現(xiàn)原生組件PlatformView提供原生view

3 、ios 端創(chuàng)建PlatformViewFactory用于生成PlatformView

4、 ios 端創(chuàng)建FlutterPlugin用于注冊(cè)原生組件

5 、flutter 平臺(tái)嵌入 原生view

iOS端的UiKitView目前還只是preview狀態(tài), 默認(rèn)是不支持的, 需要手動(dòng)打開(kāi)開(kāi)關(guān), 在info.plist文件中新增一行io.flutter.embedded_views_preview為true.

創(chuàng)建類(lèi) FlutterMapView 并實(shí)現(xiàn)FlutterPlatformView 協(xié)議

FlutterMapView.h

FlutterMapView.m

FlutterMapFactory.h

FlutterMapFactory.m

FlutterMapPlugin.h

FlutterMapPlugin.m

請(qǐng)前往 高德開(kāi)放平臺(tái)控制臺(tái) 申請(qǐng) iOS Key。

注意:Bundle Identifier需要與申請(qǐng)的時(shí)候填寫(xiě)的一致

地圖依賴的庫(kù)列舉如下:

基礎(chǔ) SDK AMapFoundationKit.framework

第一步:將解壓后的MAMapKit.framework 文件 copy 或 拖拽 到工程文件夾中,左側(cè)目錄選中工程名,在 TARGETS-Build Phases- Link Binary With Libaries 中點(diǎn)擊“+”按鈕,在彈出的窗口中點(diǎn)擊“Add Other”按鈕,選擇工程目錄下的 MAMapKit.framework 文件添加到工程中。

千萬(wàn)不要忘記將AMapFoundationKit也一起加入工程。

3D地圖正確配置應(yīng)如下圖所示:

需要引入的資源文件包括:AMap.bundle,其中:AMap.bundle 在 MAMapKit.framework 包中,AMap.bundle資源文件中存儲(chǔ)了定位、默認(rèn)大頭針標(biāo)注視圖等圖片,可利用這些資源圖片進(jìn)行開(kāi)發(fā)。

左側(cè)目錄中選中工程名,在右鍵菜單中選擇Add Files to “工程名”…,從MAMapKit.framework中選擇AMap.bundle文件,并勾選“Copy items if needed”復(fù)選框,單擊“Add”按鈕,將資源文件添加到工程中。

成功跑起來(lái) 。。 。

Flutter (三) 狀態(tài)管理

Flutter (二)布局

Flutter (三) 狀態(tài)管理

Flutter (四) Map轉(zhuǎn)模型

Flutter (五) 網(wǎng)絡(luò)請(qǐng)求

Flutter (六) 保留界面狀態(tài)

Flutter (七) 混合開(kāi)發(fā) [配置]

Flutter (八) 混合開(kāi)發(fā) [Flutter完整項(xiàng)目嵌入到原生]

【百度地圖篇】1.Flutter+百度Sdk實(shí)現(xiàn)地圖功能 & 百度地圖顯示網(wǎng)格問(wèn)題

我是初學(xué)者小白,所以很多看法不深,理解也不夠透徹。但是很適合小白們一起從低角度往高處探索。文中有錯(cuò)誤的,感謝指正,一起進(jìn)步。

趁著假期做一個(gè)Flutter的地圖功能,因?yàn)楹蠖诉x用了百度地圖,所以前端沒(méi)得挑。找了遍插件,并沒(méi)有現(xiàn)成可用的。(不過(guò)發(fā)現(xiàn)了百度官方也自開(kāi)發(fā)Flutter插件,目前功能只有一個(gè)獲取本地位置信息,后期會(huì)繼續(xù)增加吧?很期待?。?/p>

參考帖子:

這個(gè)實(shí)際上跟功能之間沒(méi)太大關(guān)系,只是我按照個(gè)人摸索的過(guò)程來(lái)寫(xiě)。

當(dāng)對(duì)一個(gè)“領(lǐng)域/知識(shí)塊”完全不懂的時(shí)候,360°的方向都不確定的話。先了解基礎(chǔ)概念,有利于你確定自己的摸索方向。

參考帖子:

中間我跳過(guò)了幾十,上百個(gè)帖子的摸索過(guò)程。這個(gè)才是關(guān)鍵能夠真正做事的參考。

因?yàn)榘俣鹊膕dk還算是很完善的,所以一旦出問(wèn)題,都會(huì)有對(duì)應(yīng)的報(bào)錯(cuò)提示。

我是使用flutter插件:permission_handler,來(lái)解決安卓的動(dòng)態(tài)授權(quán)問(wèn)題,用法簡(jiǎn)單而且設(shè)計(jì)合理。

這個(gè)錯(cuò)誤直接來(lái)看,就是簽名有問(wèn)題。怎么查看SHA1碼和包名,這里不多說(shuō),網(wǎng)上有極其多的方法,百度Sdk開(kāi)發(fā)指南里也有。沒(méi)那么復(fù)雜,也沒(méi)那么麻煩。按照流程操作就是對(duì)的。

實(shí)在不放心?跟我一樣,flutter打包后,把a(bǔ)pk反過(guò)來(lái)解SHA1碼不就行了?

參考帖子:

紅色框框基本就是帖子講解的那樣。

藍(lán)色框框見(jiàn)下圖:release標(biāo)簽里好像是自己設(shè)置了。所以debug標(biāo)簽里面,箭頭指向的位置,是我多設(shè)置的一個(gè)參數(shù)。

uid: -1 appid -1 msg: httpsPost failed,IOException:Unable to resolve host "api.map.baidu.com": No address associated with hostname

這一步我是哭笑不得,一開(kāi)始老是和問(wèn)題(2)混淆,導(dǎo)致浪費(fèi)很多時(shí)間。仔細(xì)閱讀后,發(fā)現(xiàn)是不能連接到“api.map.baidu.com”。

我打開(kāi)模擬器的chrome瀏覽器,發(fā)現(xiàn)不能上網(wǎng)。查看手機(jī)的dns是10.0.2.3(默認(rèn)的),和家里wifi不一樣,所以不能上網(wǎng)也正常,之前居然沒(méi)發(fā)現(xiàn)這個(gè)問(wèn)題?。?!

終端執(zhí)行:adb shell? 和? getprop,就可以查看所有的屬性參數(shù)了。(window小伙伴自行百度,這個(gè)沒(méi)多大差別。如果你有多個(gè)設(shè)備,記得自己選好設(shè)備。)

在里面找到這一項(xiàng),就是你的dns參數(shù)。有些人是net.dns1,我的是net.eth0.dns1。這個(gè)沒(méi)關(guān)系,只是等下指令 稍微改動(dòng) 就行。

修改dns指令:setprop net.eth0.dns1 192.168.2.1

后面的192.168.2.1是我自己的dns,這個(gè)根據(jù)自己的情況來(lái)填寫(xiě)。不懂的百度下怎么查看自己的dns。

雖然提示設(shè)置失敗,但是回到模擬器一看,地圖已經(jīng)顯示出來(lái)了。

嘿嘿,在flutter設(shè)定多大的區(qū)域,地圖就是多大的區(qū)域。用起來(lái)就很方便了。

過(guò)程十分痛苦,因?yàn)閷?duì)flutter不是很熟悉,對(duì)Android原生更是了解很少。所以自己就像突然不能講話,被丟到一個(gè)陌生的環(huán)境,卻要我去找一個(gè)人。所以細(xì)心很重要,一定要看清楚錯(cuò)誤提示,不要錯(cuò)過(guò)每一個(gè)細(xì)節(jié)和可能性。

幸好最后解決了問(wèn)題,開(kāi)心~

其實(shí)如果你仔細(xì)閱讀過(guò)百度官方的文檔,會(huì)發(fā)現(xiàn)里面有關(guān)于 地圖的生命周期管理 。然后在這里面沒(méi)有提及到,這一點(diǎn)雖然沒(méi)提,但不可或缺,小伙伴就自行思考吧。

最后還有一點(diǎn),其實(shí)我的初衷是想實(shí)現(xiàn)一個(gè)百度地圖的plugin,但是苦于能力有限,對(duì)Android的不熟悉,最后折戟。我不得已另起項(xiàng)目,然后重新實(shí)現(xiàn)地圖sdk接入。經(jīng)過(guò)這次對(duì)于這些有更多更全面的認(rèn)知后,有空會(huì)再次研究flutter 插件的開(kāi)發(fā),共勉,奧利給!!!

flutter 開(kāi)發(fā)中常用的list,map

最近打算開(kāi)始寫(xiě)點(diǎn)東西,長(zhǎng)期不寫(xiě),感覺(jué)都不會(huì)寫(xiě)東西了,寫(xiě)寫(xiě)東西總不會(huì)有錯(cuò),總是會(huì)對(duì)自己有點(diǎn)幫助的。開(kāi)始學(xué)著寫(xiě)點(diǎn)東西,開(kāi)始寫(xiě)的不好,相信寫(xiě)的多了會(huì)越來(lái)越好的。

開(kāi)始用flutter 寫(xiě)項(xiàng)目了,沒(méi)有系統(tǒng)和有條理的去學(xué)習(xí)和整理,總感覺(jué)是亂的。感覺(jué)有需要的東西還是寫(xiě)出來(lái)比較好,沒(méi)事的時(shí)候可以回顧看看,以后也可以比較下自己有沒(méi)有進(jìn)步。

flutter 開(kāi)發(fā)中常用到List 和 map,對(duì)于它的使用必須要清楚

接著上面,接下來(lái)是map

當(dāng)前標(biāo)題:flutter動(dòng)態(tài)map,Flutter動(dòng)態(tài)放大縮小布局
網(wǎng)站地址:http://m.rwnh.cn/article20/dsdhgco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、商城網(wǎng)站App設(shè)計(jì)、網(wǎng)站收錄、網(wǎng)站改版、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)
乐都县| 曲阳县| 时尚| 高尔夫| 马山县| 额尔古纳市| 永泰县| 花垣县| 炉霍县| 克什克腾旗| 赤峰市| 平定县| 勐海县| 高碑店市| 永年县| 五峰| 武陟县| 迁安市| 黑河市| 崇左市| 东宁县| 邵阳市| 长春市| 安阳县| 北安市| 长沙县| 淳化县| 个旧市| 交城县| 铜鼓县| 垣曲县| 林芝县| 海原县| 新巴尔虎右旗| 安溪县| 开阳县| 伊宁县| 翁源县| 正宁县| 玉屏| 云安县|