Flutter中最熟悉的陌生人——key

Flutter中的widget分為Stateless Widget和Stateful Widget兩大類,實際應(yīng)用中設(shè)置key對Stateless Widget影響不大,主要是在Stateful Widget中會有不同的效果,下面我們一起來看看。

首先,我們應(yīng)該清楚Flutter中的widget都是不可變的,不管是Stateful Widget還是Stateless Widget,就是一旦創(chuàng)建就不能再修改了,但是state對象是可以被修改的。

當我們在widget tree中插入了一個widget時,F(xiàn)lutter Framework會根據(jù)widget配置在element tree中對應(yīng)的location位置插入一個element對象。如果刪除了一個widget,同樣會把對應(yīng)location的element對象從樹中節(jié)點刪除。還有一種最普遍的情況就是widget的location變了,如果沒有設(shè)置key的話,那element對象和widget之間只會通過類型來查找,所以會導(dǎo)致widget信息更新了,但是state信息沒有更新,比如同一級的兩個相同Type的statefulWidget交換了位置,結(jié)果只有widget的信息“交換”了(這里的交換打引號,是因為不是widget真的交換了,widget是不可變的,其實是重建了widget對象),但是state中的信息確沒能交換,這是因為state是被element對象持有,兩個widget的Type是相同的,所以只要是在同一級中Type相同的element對象就能和widget關(guān)聯(lián),就會導(dǎo)致widget和element對象不能正確的關(guān)聯(lián)。

設(shè)置了key之后,widget就會通過key去同一級中查找element對象并關(guān)聯(lián),所以此時element對象也能交換到正確的location,state中的信息就也能成功交換了。當然,如果我們修改了widget的key,此時widget找不到相同key的element對象就會創(chuàng)建新的element對象,同時舊的key的element對象就會從節(jié)點中刪除;如果我們刪除了widget的key,那么之前這個key的element對象也找不到對應(yīng)的widget來關(guān)聯(lián),那么這個element對象會從節(jié)點中刪除,同時也會創(chuàng)建一個沒有key的新的element對象。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容