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

網(wǎng)站的建設(shè)創(chuàng)新互聯(lián)專注網(wǎng)站定制,經(jīng)驗(yàn)豐富,不做模板,主營(yíng)網(wǎng)站定制開(kāi)發(fā).小程序定制開(kāi)發(fā),H5頁(yè)面制作!給你煥然一新的設(shè)計(jì)體驗(yàn)!已為成都服務(wù)器托管等企業(yè)提供專業(yè)服務(wù)。
Widget類(lèi)在Flutter中是非常重要的,繼承自Widget類(lèi)的有PreferredSizeWidget、ProxyWidget、RenderObjectWidget、StatefulWidget、StatelessWidget。我們?nèi)粘J褂玫慕^大部分widget都是繼承自Widget類(lèi),查看Widget類(lèi)源碼,內(nèi)部實(shí)現(xiàn)非常簡(jiǎn)單,構(gòu)造函數(shù)如下:
在flutter中構(gòu)建APP是由widget樹(shù)構(gòu)建起來(lái)的,所以這個(gè)key的作用是用來(lái)控制在widget樹(shù)中替換widget的時(shí)候使用的。其中Key類(lèi)是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,常見(jiàn)的有Container、ScrollView等。如果一個(gè)控件需要?jiǎng)討B(tài)的去改變或者相應(yīng)一些狀態(tài),例如點(diǎn)擊態(tài)、色值、內(nèi)容區(qū)域等,那么一般都是繼承自StatefulWidget,常見(jiàn)的有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本身可以在控件樹(shù)中移動(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)。可以看出setState并不是立即生效,它只是將widget進(jìn)行了標(biāo)記,真正的rebuild操作,則是等到下一幀的時(shí)候才會(huì)去進(jìn)行。
StatefulWidget的兩個(gè)主要類(lèi)別:
在我的小部件的生命周期中,我是否需要考慮一個(gè)將要更改的變量,何時(shí)更改,將強(qiáng)制重建小部件?
如果問(wèn)題的答案是肯定的,那么您需要一個(gè)有狀態(tài)的小部件,否則,您需要一個(gè)無(wú)狀態(tài)小部件。
比如:
點(diǎn)擊 “協(xié)議、稅務(wù)和銀行業(yè)務(wù)”
內(nèi)購(gòu)用的是付費(fèi)應(yīng)用程序,先簽署《付費(fèi)應(yīng)用程序協(xié)議》,同意后狀態(tài)變更為“用戶信息待處理”,等待審核。
狀態(tài)更改完畢后,點(diǎn)擊“開(kāi)始設(shè)置稅務(wù)、銀行業(yè)務(wù)和聯(lián)系信息”。
(1)添加銀行賬戶,按照要求填寫(xiě)相關(guān)內(nèi)容即可。
(2)選擇報(bào)稅表,并填寫(xiě)。所有與 Apple 有商業(yè)合作者必選都是美國(guó),若有其他需求,可以多選。
繼續(xù)填寫(xiě),首先認(rèn)證公司基本信息,選擇所有人類(lèi)型,確認(rèn)無(wú)誤后認(rèn)證條款處打?qū)?/p>
Part I 部分,繼續(xù)核對(duì)公司相關(guān)信息,選填內(nèi)容可不填。
Part III 部分,簽署稅務(wù)條約,設(shè)置利益限制條款的種類(lèi),選填內(nèi)容可不填。此部分如果需要可勾選上下圖勾選框,不需要可不勾選,我們這個(gè)項(xiàng)目沒(méi)有用到part III 部分,所以沒(méi)有勾選。
Part XXX 部分,確認(rèn)之前填寫(xiě)的信息,勾選完畢后,提交
(3)填寫(xiě)聯(lián)系信息,共5個(gè)。高級(jí)管理、財(cái)務(wù)、技術(shù)、法務(wù)、營(yíng)銷(xiāo)。只需要提供5個(gè)人的基本信息即可。
只可使用一次的產(chǎn)品,使用之后即失效,必須再次購(gòu)買(mǎi)。
示例: 釣魚(yú) App 中的魚(yú)食。
只需購(gòu)買(mǎi)一次,不會(huì)過(guò)期或隨著使用而減少的產(chǎn)品。
示例: 游戲 App 的賽道。
允許用戶在固定時(shí)間段內(nèi)購(gòu)買(mǎi)動(dòng)態(tài)內(nèi)容的產(chǎn)品。除非用戶選擇取消,否則此類(lèi)訂閱會(huì)自動(dòng)續(xù)期。
示例: 每月訂閱提供流媒體服務(wù)的 App。
允許用戶購(gòu)買(mǎi)有時(shí)限性服務(wù)的產(chǎn)品。此 App 內(nèi)購(gòu)買(mǎi)項(xiàng)目的內(nèi)容可以是靜態(tài)的。此類(lèi)訂閱不會(huì)自動(dòng)續(xù)期。
示例: 為期一年的已歸檔文章目錄訂閱。
App 內(nèi)購(gòu)買(mǎi)項(xiàng)目的截屏,即所售項(xiàng)目的示意圖。例如,如果 App 內(nèi)購(gòu)買(mǎi)項(xiàng)目是一本圖書(shū),您可以提交圖書(shū)的截屏。您也可以提交購(gòu)買(mǎi)頁(yè)的截屏。該截屏僅用于 Apple 審核,不會(huì)在 App Store 中顯示。
截屏要求如下:
iOS 至少需要 640 x 920 像素
Apple tvOS 需要 1920 x 1080 像素
macOS 需要 1280 x 800 像素
App 審核圖像上傳后,可以替換,但無(wú)法移除。當(dāng)您的 App 內(nèi)購(gòu)買(mǎi)項(xiàng)目處于審核中時(shí),您無(wú)法更新截屏。
沙箱賬號(hào)是不能直接在App Store進(jìn)行登錄的,只能在點(diǎn)擊了購(gòu)買(mǎi)商品之后,在彈出的登錄框進(jìn)行登錄 。
驗(yàn)證是否已登錄沙箱測(cè)試賬號(hào):
設(shè)置--iTunes Store與App Store,頁(yè)面拉到最底部,會(huì)看到沙箱賬戶項(xiàng)會(huì)列出你已登錄的沙箱測(cè)試賬號(hào)!
操作方法一:打開(kāi)App Store應(yīng)用首頁(yè)滑到最下方--選中AppleID--注銷(xiāo)
操作方法二:設(shè)置--iTunes Store與App Store--選中AppleID--注銷(xiāo)
checks if the client can make payments(檢測(cè)App是否能支付)
getAvailablePurchases
Get all non-consumed purchases 獲取未消費(fèi)的商品
打印信息查詢;
原因:
沒(méi)有先執(zhí)行g(shù)etProducts,直接執(zhí)行requestPurchase方法,要先拉取商品列表,再執(zhí)行購(gòu)買(mǎi)操作.
問(wèn)題描述;
1.漏單必須要處理,玩家花RMB購(gòu)買(mǎi)的東西卻丟失了,是絕對(duì)不能容忍的。所謂的漏單就是玩家已經(jīng)正常付費(fèi),卻沒(méi)有拿到該拿的道具。
解決:只要購(gòu)買(mǎi)成功,便將購(gòu)買(mǎi)記錄(receipt等賬單信息)保存下來(lái),然后將賬單信息傳送給我們游戲服務(wù)器,游戲服務(wù)器獲得賬單后,和蘋(píng)果服務(wù)器驗(yàn)證,賬單有效的話,回饋給游戲服務(wù)器處理,游戲服務(wù)器處理后,返回給游戲客戶端處理,處理完畢,將本地保存的購(gòu)買(mǎi)記錄刪除。
官方文檔:向蘋(píng)果校驗(yàn)支付憑證
21000 App Store無(wú)法讀取你提供的JSON數(shù)據(jù)
21002 收據(jù)數(shù)據(jù)不符合格式
21003 收據(jù)無(wú)法被驗(yàn)證
21004 你提供的共享密鑰和賬戶的共享密鑰不一致
21005 收據(jù)服務(wù)器當(dāng)前不可用
21006 收據(jù)是有效的,但訂閱服務(wù)已經(jīng)過(guò)期。當(dāng)收到這個(gè)信息時(shí),解碼后的收據(jù)信息也包含在返回內(nèi)容中
21007 收據(jù)信息是測(cè)試用(sandbox),但卻被發(fā)送到產(chǎn)品環(huán)境中驗(yàn)證 【請(qǐng)求sandbox校驗(yàn)支付憑證】
21008 收據(jù)信息是產(chǎn)品環(huán)境中使用,但卻被發(fā)送到測(cè)試環(huán)境中驗(yàn)證
消耗類(lèi)型: 例如:金幣、道具等。
非續(xù)訂訂閱: non-renewable subscription 例如:VIP
您的首個(gè) App 內(nèi)購(gòu)買(mǎi)項(xiàng)目必須以新的 App 版本提交。請(qǐng)創(chuàng)建您的 App 內(nèi)購(gòu)買(mǎi)項(xiàng)目,然后前往 App 的“App Store”頁(yè),從“App 內(nèi)購(gòu)買(mǎi)項(xiàng)目”中進(jìn)行選擇,點(diǎn)按“提交”。 了解更多
在上傳二進(jìn)制文件并提交首個(gè) App 內(nèi)購(gòu)買(mǎi)項(xiàng)目以供審核后,您可以使用下表提交其他 App 內(nèi)購(gòu)買(mǎi)項(xiàng)目。
唐巧-iOS應(yīng)用內(nèi)付費(fèi)(IAP)開(kāi)發(fā)步驟列表
未完~待續(xù)
當(dāng)使用內(nèi)購(gòu)購(gòu)買(mǎi)過(guò)商品之后沒(méi)有把這個(gè)交易關(guān)閉,所以再次去購(gòu)買(mǎi)商品后就會(huì)調(diào)用以前已經(jīng)購(gòu)買(mǎi)成功的交易去購(gòu)買(mǎi)因?yàn)橐呀?jīng)購(gòu)買(mǎi)過(guò),才會(huì)有這個(gè)提示
原因:添加內(nèi)購(gòu)項(xiàng)目時(shí),信息填寫(xiě)不完整,app審核圖像未上傳
處理方法:上傳app審核圖片( 合適的尺寸 ),點(diǎn)擊提交,狀態(tài)改為正在準(zhǔn)備審核中。
這個(gè)是內(nèi)購(gòu)選擇類(lèi)型不匹配原因?qū)е隆?/p>
購(gòu)買(mǎi)成功之后,Apple會(huì)返回以下四個(gè)數(shù)據(jù)給應(yīng)用
Reference
Review the updated Paid Applications Schedule.
游客身份解決方案:即不登錄也要能購(gòu)買(mǎi)
1)服務(wù)器端做一個(gè)蘋(píng)果審核機(jī)制,審核期間游客身份可以進(jìn)行一切行為,一旦審核通過(guò),修改服務(wù)端即可達(dá)到強(qiáng)制用戶登錄進(jìn)行內(nèi)購(gòu)買(mǎi)的目的(這個(gè)有點(diǎn)。。。)
2)游客可以進(jìn)行內(nèi)購(gòu)買(mǎi),購(gòu)買(mǎi)時(shí)以設(shè)備UUID為準(zhǔn),生成一個(gè)游客賬號(hào),將購(gòu)買(mǎi)信息保存在服務(wù)器和本地,當(dāng)用戶登錄正式賬戶后判斷此設(shè)備是否進(jìn)行過(guò)內(nèi)購(gòu),有的話提示用戶將游客身份購(gòu)買(mǎi)的權(quán)益與現(xiàn)有賬號(hào)綁定,如果綁定,游客權(quán)益則遷移到正式賬戶,如果不遷移,則游客身份和正是賬戶是兩個(gè)獨(dú)立賬戶,正式賬戶不享有游客身份的權(quán)益(我用的這個(gè))
內(nèi)購(gòu)游客模式解決方案
iOS內(nèi)購(gòu)規(guī)則
針對(duì)日常不同的需求,我們時(shí)常需要自定義 Dialog ,而小菜在嘗試過(guò)程中遇到一些小問(wèn)題,簡(jiǎn)單記錄總結(jié)一下;
小菜在自定義含有文本框的 Dialog 時(shí),文本框獲取焦點(diǎn)時(shí),軟鍵盤(pán)會(huì)部分遮擋對(duì)話框,但當(dāng)小菜替換為 AlertDialog 時(shí),文本框獲取焦點(diǎn)時(shí),對(duì)話框會(huì)向上浮動(dòng),避免軟鍵盤(pán)遮擋;
對(duì)于含有文本框的自定義 Dialog ,小菜在最外層使用的是 Material 嵌套,小菜通過(guò)采用 Scaffold 來(lái)嵌套處理,默認(rèn) Scaffold 中 resizeToAvoidBottomPadding / resizeToAvoidBottomInset 為 true ,當(dāng)設(shè)置為 false 時(shí),文本框獲取焦點(diǎn)時(shí),依舊會(huì)被軟鍵盤(pán)遮擋;因?yàn)樵诠潭ㄇ榫翱梢耘浜? resizeToAvoidBottomPadding 實(shí)現(xiàn)是否被軟鍵盤(pán)遮擋效果;
resizeToAvoidBottomPadding 主要用于自身 Widget 是否避免被其他窗口遮擋;其中小菜查資料介紹在 Flutter 1.1.9 之后更推薦使用 resizeToAvoidBottomInset ;
小菜自定義一個(gè)可以多選 item 的 Dialog ,但 Dialog 中并沒(méi)有狀態(tài)更新的 State ,如何進(jìn)行 Dialog 中狀態(tài)更新呢?
小菜之前在 showDialog 時(shí)直接創(chuàng)建了 TypeListDialog ,此時(shí)是無(wú)狀態(tài)的,當(dāng) WidgetBuilder 創(chuàng)建一個(gè) StatefulBuilder 有狀態(tài)的構(gòu)造器即可,可以將 state 傳遞到 Dialog 中;
小菜在自定義 Dialog 時(shí)如何在一個(gè)回調(diào)方法中傳遞多個(gè)參數(shù)?
小菜在 Dialog 的回調(diào)方法中傳遞兩個(gè) List ,而在接收回調(diào)方法中匹配兩個(gè)參數(shù)即可;小菜簡(jiǎn)單看作是一個(gè)函數(shù)方法;
小菜在重寫(xiě) AppBar 時(shí),如何取消默認(rèn)的返回按鈕?
取消 AppBar 前面的返回圖標(biāo)有多種方式;
自定義 Dialog 案例源碼
小菜對(duì)于 Flutter 的應(yīng)用還不夠熟悉,很多常用的場(chǎng)景會(huì)處理的很不到位,小菜會(huì)對(duì)日常的小問(wèn)題進(jìn)行簡(jiǎn)單記錄,逐步學(xué)習(xí);如有錯(cuò)誤,請(qǐng)多多指導(dǎo)!
網(wǎng)頁(yè)題目:flutter小結(jié),flutter筆記
網(wǎng)頁(yè)URL:http://chinadenli.net/article38/dsipgpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、標(biāo)簽優(yōu)化、外貿(mào)網(wǎng)站建設(shè)、定制開(kāi)發(fā)、面包屑導(dǎo)航、網(wǎng)站建設(shè)
聲明:本網(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)