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

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

flutter動(dòng)態(tài)壁紙,flutter 桌面

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

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

成都創(chuàng)新互聯(lián)是一家集成都網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)站頁(yè)面設(shè)計(jì)、網(wǎng)站優(yōu)化SEO優(yōu)化為一體的專業(yè)網(wǎng)站制作公司,已為成都等多地近百家企業(yè)提供網(wǎng)站建設(shè)服務(wù)。追求良好的瀏覽體驗(yàn),以探求精品塑造與理念升華,設(shè)計(jì)最適合用戶的網(wǎng)站頁(yè)面。 合作只是第一步,服務(wù)才是根本,我們始終堅(jiān)持講誠(chéng)信,負(fù)責(zé)任的原則,為您進(jìn)行細(xì)心、貼心、認(rèn)真的服務(wù),與眾多客戶在蓬勃發(fā)展的市場(chǎng)環(huán)境中,互促共生。

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

參考帖子:

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

當(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開發(fā)指南里也有。沒(méi)那么復(fù)雜,也沒(méi)那么麻煩。按照流程操作就是對(duì)的。

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

參考帖子:

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

藍(lá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

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

我打開模擬器的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)填寫。不懂的百度下怎么查看自己的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)題,開心~

其實(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 插件的開發(fā),共勉,奧利給?。?!

Flutter dynamic_widget框架支持json code導(dǎo)出功能

dynamic_widget 是一個(gè)可以用json來(lái)描述flutter widget的動(dòng)態(tài)布局框架,json code和flutter widget code一一對(duì)應(yīng),如下圖:

dynamic_widget:

Flutter_定義控件StatefulWidgets和StatelessWidget

Stateful(有狀態(tài)) 和 stateless(無(wú)狀態(tài)) widgets

stateless widget 沒(méi)有內(nèi)部狀態(tài). Icon、 IconButton, 和Text 都是無(wú)狀態(tài)widget, 他們都是 StatelessWidget的子類。

stateful widget 是動(dòng)態(tài)的. 用戶可以和其交互 (例如輸入一個(gè)表單、 或者移動(dòng)一個(gè)slider滑塊),或者可以隨時(shí)間改變 (也許是數(shù)據(jù)改變導(dǎo)致的UI更新). Checkbox, Radio, Slider, InkWell, Form, and TextField 都是 stateful widgets, 他們都是 StatefulWidget的子類。

StatefulWidget類

具有可變狀態(tài)的小部件。

狀態(tài)是(1)在構(gòu)建窗口小部件時(shí)可以同步讀取的信息,以及(2)在窗口小部件的生命周期內(nèi)可能會(huì)更改的信息。這是小工具實(shí)施者的責(zé)任,以確保國(guó)家的及時(shí)通知當(dāng)這種狀態(tài)的改變,使用State.setState。

有狀態(tài)窗口小部件是一個(gè)窗口小部件,它通過(guò)構(gòu)建一個(gè)更具體地描述用戶界面的其他窗口小部件來(lái)描述用戶界面的一部分。構(gòu)建過(guò)程以遞歸方式繼續(xù),直到用戶界面的描述完全具體(例如,完全由RenderObjectWidget組成,其描述具體的RenderObject)。

當(dāng)您描述的用戶界面部分可以動(dòng)態(tài)更改時(shí)(例如由于具有內(nèi)部時(shí)鐘驅(qū)動(dòng)狀態(tài)或依賴于某些系統(tǒng)狀態(tài)),狀態(tài)窗口小部件非常有用。對(duì)于僅依賴于對(duì)象本身中的配置信息以及窗口小部件膨脹的 BuildContext的組合,請(qǐng)考慮使用 StatelessWidget。

StatefulWidget實(shí)例本身是不可變的,并且將它們的可變狀態(tài)存儲(chǔ)在由createState方法創(chuàng)建的單獨(dú)State對(duì)象中 ,或者存儲(chǔ)在State訂閱的對(duì)象中,例如Stream或ChangeNotifier對(duì)象,其引用存儲(chǔ)在StatefulWidget的最終字段中本身。

框架在膨脹StatefulWidget時(shí) 調(diào)用createState,這意味著如果該窗口小部件已插入到多個(gè)位置的樹中,則多個(gè)State對(duì)象可能與同一StatefulWidget關(guān)聯(lián)。同樣,如果StatefulWidget從樹中移除,后來(lái)在樹再次插入時(shí),框架將調(diào)用createState再創(chuàng)建一個(gè)新的國(guó)家目標(biāo),簡(jiǎn)化的生命周期狀態(tài)的對(duì)象。

如果StatefulWidget的創(chuàng)建者使用GlobalKey作為其 鍵,則StatefulWidget在從樹中的一個(gè)位置移動(dòng)到另一個(gè)位置時(shí)保持相同的State對(duì)象。由于具有GlobalKey的窗口小部件可以在樹中的至多一個(gè)位置使用,因此使用GlobalKey的窗口小部件最多只有一個(gè)關(guān)聯(lián)元素。當(dāng)通過(guò)將與該窗口小部件關(guān)聯(lián)的(唯一)子樹從舊位置移植到新位置(而不是在該位置重新創(chuàng)建子樹)時(shí),框架利用此屬性將全局鍵從樹中的一個(gè)位置移動(dòng)到另一個(gè)位置時(shí)利用此屬性。新的位置)。與StatefulWidget關(guān)聯(lián)的State對(duì)象與子樹的其余部分一起被移植,這意味著State對(duì)象在新位置被重用(而不是被重新創(chuàng)建)。但是,為了有資格進(jìn)行嫁接,必須將窗口小部件插入到從舊位置移除它的同一動(dòng)畫幀中的新位置。

StatefulWidget有兩個(gè)主要類別。

首先是其中一個(gè)分配資源State.initState并在他們的處置State.dispose,但不依賴于InheritedWidget S或致電State.setState。這些小部件通常在應(yīng)用程序或頁(yè)面的根目錄中使用,并通過(guò)ChangeNotifier, Stream或其他此類對(duì)象與子小部件進(jìn)行通信。遵循這種模式的有狀態(tài)小部件相對(duì)便宜(就CPU和GPU周期而言),因?yàn)樗鼈儤?gòu)建一次然后永不更新。因此,它們可能有一些復(fù)雜和深刻的構(gòu)建方法。

第二類是使用State.setState或依賴于 InheritedWidget的小部件。這些通常會(huì)在應(yīng)用程序的生命周期內(nèi)重建多次,因此最小化重建此類窗口小部件的影響非常重要。(他們也可以使用State.initState或 State.didChangeDependencies并分配資源,但重要的是他們重建。)

可以使用幾種技術(shù)來(lái)最小化重建有狀態(tài)窗口小部件的影響:

StatelessWidget類

一個(gè)不需要可變狀態(tài)的小部件。

無(wú)狀態(tài)窗口小部件是一個(gè)窗口小部件,它通過(guò)構(gòu)建一個(gè)更具體地描述用戶界面的其他窗口小部件來(lái)描述用戶界面的一部分。構(gòu)建過(guò)程以遞歸方式繼續(xù),直到用戶界面的描述完全具體(例如,完全由RenderObjectWidget組成,其描述具體的RenderObject)。

當(dāng)您描述的用戶界面部分不依賴于對(duì)象本身的配置信息以及窗口小部件膨脹的BuildContext時(shí),無(wú)狀態(tài)窗口小部件非常有用。對(duì)于可以動(dòng)態(tài)更改的組合,例如由于具有內(nèi)部時(shí)鐘驅(qū)動(dòng)狀態(tài)或依賴于某些系統(tǒng)狀態(tài),請(qǐng)考慮使用StatefulWidget。

無(wú)狀態(tài)窗口小部件的構(gòu)建方法通常僅在以下三種情況下調(diào)用:第一次將窗口小部件插入樹中,窗口小部件的父窗口更改其配置時(shí),以及何時(shí)依賴于更改的InheritedWidget。

如果窗口小部件的父級(jí)將定期更改窗口小部件的配置,或者它依賴于經(jīng)常更改的繼承窗口小部件,則優(yōu)化構(gòu)建方法的性能以保持流暢的呈現(xiàn)性能非常重要。

可以使用幾種技術(shù)來(lái)最小化重建無(wú)狀態(tài)窗口小部件的影響:

Flutter 集成第三方藍(lán)牙庫(kù)踩坑記錄

最近在寫flutter應(yīng)用,需要集成藍(lán)牙功能,用了一個(gè)第三方的庫(kù),踩了一些坑,做一下記錄。

這是庫(kù)的地址 PhilipsHue/flutter_reactive_ble: Flutter library that handles BLE operations for multiple devices. (github.com)

安卓主要的坑就是,在使用藍(lán)牙功能的時(shí)候,需要獲取定位權(quán)限,這個(gè)需要?jiǎng)討B(tài)獲取。

集成之后,編譯出錯(cuò),提示Swift Compiler Error。

(1)首先嘗試,修改對(duì)應(yīng)三方庫(kù)的Swift編譯版本。

我這邊嘗試修改,沒(méi)有成功。

(2) 沒(méi)辦法,我這邊手動(dòng)修改三方庫(kù)的源碼文件,進(jìn)行修復(fù)。重新編譯成功。

其他問(wèn)題

Flutter局部刷新方法

Flutter中Widget分為StatefulWidget和StatelessWidget,分別為動(dòng)態(tài)視圖和靜態(tài)視圖,視圖的更新需要調(diào)用StatefulWidget的setState方法,這會(huì)遍歷調(diào)用子Widget的build方法。當(dāng)一個(gè)主頁(yè)面比較復(fù)雜時(shí),會(huì)包含多個(gè)widget,如果直接調(diào)用setState,會(huì)遍歷所有子Widget的build,這是非常不必要的性能開銷,有沒(méi)有單獨(dú)刷新指定Widget的方式呢?這個(gè)時(shí)候就要用到GlobalKey了。

一個(gè)StatefulWidget包含一個(gè)Button,一個(gè)Text,通過(guò)點(diǎn)擊Button調(diào)用主Widget的setState方法,刷新Text,示例如下:

同樣一個(gè)StatefulWidget包含一個(gè)多個(gè)Text和Button,點(diǎn)擊Button我們只需要刷新指定的Text,通過(guò)GlobalKey的方式,實(shí)現(xiàn)如下:

主Widget,包含一個(gè)需要更新的TextWidget和一個(gè)不需要更新的Text

需要單獨(dú)更新的Widget

傳遞事件的Button

這樣點(diǎn)擊Button就只會(huì)更新指定的TextWidget了,效果如下:

這只是一個(gè)簡(jiǎn)單的例子,在實(shí)際開發(fā)中為了頁(yè)面刷新的高效率,模塊化封裝非常重要。很多情況下都只需要局部刷新,而不是重構(gòu)整個(gè)視圖。所以Globalkey的運(yùn)用在項(xiàng)目中需要熟練掌握

Widget總結(jié)

Flutter中Widget,State和BuildContext的概念是每個(gè)Flutter開發(fā)人員需要完全理解的最重要概念之一。這里先講解一下Widget以及Widget。三者之間的關(guān)系會(huì)在最后一篇總結(jié)一下。

Widget類在Flutter中是非常重要的,繼承自Widget類的有PreferredSizeWidget、ProxyWidget、RenderObjectWidget、StatefulWidget、StatelessWidget。我們?nèi)粘J褂玫慕^大部分widget都是繼承自Widget類,查看Widget類源碼,內(nèi)部實(shí)現(xiàn)非常簡(jiǎn)單,構(gòu)造函數(shù)如下:

在flutter中構(gòu)建APP是由widget樹構(gòu)建起來(lái)的,所以這個(gè)key的作用是用來(lái)控制在widget樹中替換widget的時(shí)候使用的。其中Key類是Widget、Element以及SemanticsNode的唯一標(biāo)識(shí)符,繼承自Key的還有LocalKey以及GlobalKey。詳細(xì)可以去framework.dart文件查看相關(guān)源碼及說(shuō)明。

在Flutter中,我們平時(shí)自定義的widget,一般都是繼承自StatefulWidget或StatelessWidget(并不是只有這兩種),這兩種widget也是目前最常用的兩種。如果一個(gè)控件自身狀態(tài)不會(huì)去改變,創(chuàng)建了就直接顯示,不會(huì)有色值、大小或者其他屬性的變化,這種widget一般都是繼承自StatelessWidget,常見的有Container、ScrollView等。如果一個(gè)控件需要?jiǎng)討B(tài)的去改變或者相應(yīng)一些狀態(tài),例如點(diǎn)擊態(tài)、色值、內(nèi)容區(qū)域等,那么一般都是繼承自StatefulWidget,常見的有CheckBox、AppBar、TabBar等。兩者的差別在于是否有狀態(tài)。

對(duì)于StatelessWidget,build方法會(huì)在如下三種情況下調(diào)用:

我們?cè)趧?chuàng)建State的時(shí)候可以看到和StatefulWidget相似的build方法,也就是說(shuō)我們也可以獲得一個(gè)BuildContext,在使用StatefulWidget.createState創(chuàng)建它們之前以及在調(diào)用initState之前,框架將State對(duì)象與BuildContext關(guān)聯(lián)起來(lái),該關(guān)聯(lián)是永久的:State對(duì)象永遠(yuǎn)不會(huì)改變它的BuildContext(但是BuildContext本身可以在控件樹中移動(dòng))。后面講解一下這個(gè)BuildContext對(duì)象在整個(gè)程序中什么角色

State的作用有兩點(diǎn):

State的生命周期有四種狀態(tài):

完整生命周期如下:

當(dāng)控件的配置被更改時(shí)會(huì)調(diào)用State.didUpdateWidget方法,此時(shí)框架會(huì)重新繪制控件。你也可以使用State.setState方法在狀態(tài)發(fā)生變化時(shí)通知框架,告訴框架該對(duì)象的內(nèi)部狀態(tài)已經(jīng)改變,框架接到通知后也會(huì)重新繪制控件。

State中比較重要的一個(gè)方法是setState,當(dāng)修改狀態(tài)時(shí),widget會(huì)被更新。比方說(shuō)點(diǎn)擊CheckBox,會(huì)出現(xiàn)選中和非選中狀態(tài)之間的切換,就是通過(guò)修改狀態(tài)來(lái)達(dá)到的。查看setState源碼,在一些異常的情況下將會(huì)拋出異常:

markNeedsBuild內(nèi)部,則是通過(guò)標(biāo)記element為diry,在下一幀的時(shí)候重建(rebuild)??梢钥闯鰏etState并不是立即生效,它只是將widget進(jìn)行了標(biāo)記,真正的rebuild操作,則是等到下一幀的時(shí)候才會(huì)去進(jìn)行。

StatefulWidget的兩個(gè)主要類別:

在我的小部件的生命周期中,我是否需要考慮一個(gè)將要更改的變量,何時(shí)更改,將強(qiáng)制重建小部件?

如果問(wèn)題的答案是肯定的,那么您需要一個(gè)有狀態(tài)的小部件,否則,您需要一個(gè)無(wú)狀態(tài)小部件。

比如:


分享名稱:flutter動(dòng)態(tài)壁紙,flutter 桌面
文章網(wǎng)址:http://weahome.cn/article/dsdehjo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部