現(xiàn)象:
目前創(chuàng)新互聯(lián)已為上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計(jì)、翁源網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
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)事件。沒有的話再扔出去點(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è)蒙層。
打印結(jié)果為
1、widget的 構(gòu)造方法
2、widget的 createState 方法
3、state的 構(gòu)造方法
4、state的 initState 方法,(重寫該方法時(shí),必須要先調(diào)用 super. initState() )
5、 didChangeDependencies方法 ,分兩種情況:
(5.1)、調(diào)用 initState 方法后,會(huì)調(diào)用該方法,
(5.2)、從其他 widget 中依賴一些 數(shù)據(jù)發(fā)生改變 時(shí),比如用 InheritedWidget , provider 來(lái)監(jiān)聽數(shù)據(jù)的改變)
6、state的 build方法 (當(dāng)調(diào)用 setState 方法,會(huì)重新調(diào)用 build 進(jìn)行渲染)
7、state的 deactivate 方法(當(dāng)state被暫時(shí)從視圖移除的時(shí)候會(huì)調(diào)用,頁(yè)面 push 走、 pop 回來(lái)的時(shí)候都會(huì)調(diào)用。因?yàn)閜ush、pop會(huì)改變widget在視圖樹位置,需要先移除再添加。重寫該方法時(shí),必須要先調(diào)用 super.deactivate() )
8、state的 dispose 方法。頁(yè)面被銷毀的時(shí)候調(diào)用,如: pop 操作。通常情況下,自己的釋放邏輯放在 super.dispose() 之前,先操作子類在操作父類。
Set是不能重復(fù)的集合,所以可以用Set去重;
String、int、double類型示例,如下:
String類型:
int類型:
double類型:
可以看到, Set集合可直接對(duì)String、int、double類型去重 ;
Map、List、bool類型和String、int、double類型對(duì)比示例,如下:
可以看到,當(dāng)自定義對(duì)象實(shí)例化為同一個(gè)對(duì)象時(shí),Set會(huì)過(guò)濾掉同一個(gè)實(shí)例化的對(duì)象;當(dāng)自定義對(duì)象實(shí)例化為不同對(duì)象時(shí),Set不會(huì)去重,即使對(duì)象數(shù)據(jù)內(nèi)容一樣,這不符合我們的業(yè)務(wù);
可以看到,重寫自定義對(duì)象==方法,Set還是不能去重;
上面重寫自定義對(duì)象hashCode和==方法,以title不同區(qū)分不同對(duì)象;
可以看到,重寫自定義對(duì)象hashCode和==方法,Set集合對(duì)自定義對(duì)象去重才有效;并且Set集合里有相同對(duì)象時(shí)(相同對(duì)象為上面自定義對(duì)象title值相同的對(duì)象),后面相同的對(duì)象就不會(huì)被加入Set集合里了( 如上面title一樣,boolValue不一樣,這樣被認(rèn)為相同的對(duì)象,因?yàn)橹貙懽远x對(duì)象hashCode和==方法,以title不同區(qū)分不同對(duì)象;Set集合里最開始加入的TestModel('a', boolValue: false),數(shù)據(jù)不會(huì)被相同對(duì)象TestModel('a', boolValue: true)覆蓋 )。
網(wǎng)上介紹flutter Set集合時(shí)一般會(huì)介紹Set沒有順序,這點(diǎn)不太理解,可能是不能通過(guò)索引來(lái)獲取對(duì)應(yīng)的值吧,像Java語(yǔ)言的Set集合確實(shí)是無(wú)序的,但flutter的Set集合保持著子元素的有序性。 如下:
可以看到,將Set通過(guò)toList()方法轉(zhuǎn)為L(zhǎng)ist后,List里子元素的順序和子元素插入Set集合的順序是一致;對(duì)于自定義對(duì)象亦是如此,可自行驗(yàn)證。
為什么Set集合會(huì)保持子元素插入順序呢
我們看下Set源碼,如下:
從源碼我們可知,Set()是一個(gè)工廠構(gòu)造方法,根據(jù)工廠構(gòu)造方法的特點(diǎn),Set是由LinkedHashSet實(shí)例化的。
從上面注釋可知,HashSet是無(wú)序的,LinkedHashSet保持著子元素插入的順序。而Set是由LinkedHashSet實(shí)例化的,所以Set保持著子元素插入的順序。
如想要深入分析LinkedHashSet,LinkedHashSet源碼中有很多external聲明的方法,可參考 如何找到flutter external聲明方法的實(shí)現(xiàn)
demo傳送門