class _OpenLogListComponentState extends StateOpenLogListComponent with AutomaticKeepAliveClientMixin{
目前創(chuàng)新互聯(lián)建站已為近千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁(yè)空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、貢井網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
@protected
bool get wantKeepAlive=true;
//其他邏輯
}
方法二: 使用IndexedStack存儲(chǔ)頁(yè)面
_body = IndexedStack(
children: Widget[
BookHousePage(),
FunctionPage(),
ChatPage(),
MinePage()
],
index: _currentPageIndex,
);
這里需要混入WidgetsBindingObserver,重寫didChangeAppLifecycleState方法才能看到app進(jìn)入前后臺(tái)的狀態(tài)
我這邊使用的是一個(gè)嵌套行頁(yè)面,主頁(yè)面(TabBarViewPage)是一個(gè)TabBar+TabBarView實(shí)現(xiàn)的子頁(yè)面切換,子頁(yè)面是三個(gè)頁(yè)面(HomeItemPage,EmailItemPage,MineItemPage)
子頁(yè)面互相切換的時(shí)候下一個(gè)頁(yè)面創(chuàng)建,上一個(gè)頁(yè)面就會(huì)被銷毀,這是flutter默認(rèn)的情況,頁(yè)面會(huì)被移除然后重載。當(dāng)然你也可以設(shè)置需要的頁(yè)面不被重載的頁(yè)面,這個(gè)后面再講
解決頁(yè)面重載需要三步
可以看到home并沒(méi)有被銷毀也沒(méi)有重載,但是mail被銷毀了然后重載了
可以看到當(dāng)主頁(yè)面銷毀的時(shí)候,home也是被銷毀的
現(xiàn)象:
flutter頁(yè)面通過(guò)present跳轉(zhuǎn)原生頁(yè)面后,原生頁(yè)面上的點(diǎn)擊會(huì)首先響應(yīng)下面的flutter頁(yè)面中的內(nèi)容(比如按鈕什么的)。
這是flutter框架一直存在的一個(gè)bug。在github上有相關(guān)的issue。
原因推測(cè):
推測(cè)是flutter對(duì)控制器(或者view)加了分類,重寫了控制器的點(diǎn)擊事件,用來(lái)計(jì)算是否在對(duì)應(yīng)的點(diǎn)擊位置有flutter響應(yīng)事件。沒(méi)有的話再扔出去點(diǎn)擊事件。
解決方案1:
在原生控制器中,加入點(diǎn)擊事件的幾個(gè)方法的空實(shí)現(xiàn),用以覆蓋flutter框架中的實(shí)現(xiàn):
-(void)touchesBegan:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{
}
-(void)touchesMoved:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{
}
-(void)touchesCancelled:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{
}
-(void)touchesEnded:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{
}
讓事件不被flutter截獲即可。
解決方案2:
直接切換window的根控制器到原生控制器即可。別忘暫時(shí)保存flutter控制器。
在返回時(shí)再切換回flutter中。
解決方案3:
在flutter跳轉(zhuǎn)到原生頁(yè)面之前,在flutter中加上一個(gè)蒙層,用來(lái)隔絕手勢(shì)往flutter下面的view傳遞。原生頁(yè)面返回flutter時(shí)再移除這個(gè)蒙層。
這篇將會(huì)解決手動(dòng)切換主題以及跟隨手機(jī)切換主題來(lái)更新UI(包括自己創(chuàng)建的Widget)
主題切換有個(gè)問(wèn)題,就是如果是我們自定義或者在 build() 自己創(chuàng)建的部件是不會(huì)隨著系統(tǒng)的主題切換而發(fā)生主題色變化的(實(shí)際測(cè)試中,如果頁(yè)面在頂層(沒(méi)有被push)切換主題并不會(huì)觸發(fā) build() 方法,(push之后的頁(yè)面切換系統(tǒng)主題是可以觸發(fā) build() 的,而且會(huì)頻繁觸發(fā)好多次...),既然無(wú)法通過(guò)重新 build 更新組件的主題色,那么我們?cè)谇袚Q主題后,強(qiáng)制觸發(fā)整個(gè)app的 build() 就可以了)
有時(shí)候我們不希望某個(gè)頁(yè)面每次打開(kāi)時(shí)都重新加載,比如就我們之前的Tabbar結(jié)構(gòu)的頁(yè)面,每當(dāng)我們?cè)谇袚QTab的時(shí)候都會(huì)執(zhí)行 void initState() ,這就意味著頁(yè)面每次都會(huì)重新渲染,之所以這樣就是因?yàn)槲覀兊?State 狀態(tài)沒(méi)有保存,如下圖所示:
[沒(méi)有狀態(tài)保存效果圖]
給當(dāng)前 State 類添加一個(gè)擴(kuò)展(這里就用擴(kuò)展這個(gè)詞吧,其實(shí)類似于iOS下的 Category ),一個(gè)系統(tǒng)的擴(kuò)展類 AutomaticKeepAliveClientMixin ,并重寫 wantKeepAlive 方法,讓一個(gè)普通的 State 類,具有保存狀態(tài)的能力。
在Dart語(yǔ)法中通過(guò)使用 with 關(guān)鍵字來(lái)添加擴(kuò)展:
bool get wantKeepAlive = true; 之后,當(dāng)前 State 就具備保存能力了,也就意味著重復(fù)切換Tab后, void initState() 就不會(huì)重復(fù)執(zhí)行了(由原來(lái)的 viewWillAppear() 變成了 viewDidLoad() )。
按照上面方式修改后,發(fā)現(xiàn)切換Tab后 void initState() 依然重復(fù)執(zhí)行了,這是為什么吶?這里我們看下我們之前 root_page.dart 里面是如何配置我們的tabbar結(jié)構(gòu)的:
這里我們是通過(guò)一個(gè) _viewControllers 的List,把4個(gè)子頁(yè)面放在了里面,全局有一個(gè) _currentIndex ,當(dāng) onTap 回調(diào)后后,更新 _currentIndex 的值,執(zhí)行 setState () 后, body 對(duì)應(yīng)的 widget 頁(yè)面發(fā)生改變。而問(wèn)題也就出在這里,當(dāng) body 部分發(fā)生改變時(shí),根據(jù)Flutter的底層渲染邏輯,這里會(huì)移除掉之前的 Widget ,并重新創(chuàng)建新的 Widget ,我們之前在 _viewControllers 放的子頁(yè)面,并不像iOS下是一個(gè)實(shí)例對(duì)象,存在就直接拿來(lái)使用。在Flutter 中 setState () 后界面會(huì)被重新繪制,而 body 部分只知道我要渲染一個(gè)什么樣的 widget ,而該類型的 widget 每次都是會(huì)重新創(chuàng)建,這也就意味著我們?cè)赥ab切換時(shí),每次都是重新創(chuàng)建,所以每次都執(zhí)行了 initState() 。
顯然我們現(xiàn)在的方式是不合理的,那在Flutter中如何管理這樣的子頁(yè)面,而避免重復(fù)渲染吶?
這就要用到一個(gè)新的部件了: PageView() ,內(nèi)部的2個(gè)關(guān)鍵屬性:
子頁(yè)面切換通過(guò) _controller.jumpToPage(index); 來(lái)實(shí)現(xiàn)。
這樣子頁(yè)面也就不會(huì)重新創(chuàng)建渲染了,我們的狀態(tài)保存也就能正常實(shí)現(xiàn)了。
學(xué)習(xí)是一個(gè)循序漸進(jìn)的過(guò)程,我們總是在踩坑中不斷的前行,把坑填平了也就意味著我們?cè)谶@個(gè)新的東西面前立了足,就可能進(jìn)行更多為什么的探索了。
本文題目:flutter頁(yè)面切換,flutter 頁(yè)面特效
網(wǎng)頁(yè)鏈接:http://m.rwnh.cn/article16/phjjgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、建站公司、搜索引擎優(yōu)化、服務(wù)器托管、網(wǎng)站策劃、用戶體驗(yàn)
聲明:本網(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)