flutter的key在widget list的作用以及必要性

在做一個flutter的項目過程中,體會到了key在widget渲染中發揮的作用以及開發者需要避免的坑,在次提出共勉

與react的diff算法類似(vue的也是),flutter在渲染同級類似的item的時候也是採用key值判斷來重新渲染的。
因此如果你的業務中如果包含了一個同類型的widget list,記得要爲每個widget加上一個key,否則flutter也是默認使用item在list的index作爲key,這樣就會遇到下面這個常見的坑了:

假設原本有一個list,

list = [widget0: {key: 0, ...}, widget1: {key: 1, ...}, widget2: {key: 2, ...}]

對應的視圖爲:

圖片描述

現在我們刪除中間的widget1,list更新成:

list = [widget0: {key: 0, ...}, widget2: {key: 1, ...}]

對應的視圖爲:

可以看到,widget1沒有被刪除,而是widget2被刪除了,這顯示是錯誤的。
原因便在於:
雖然widget1在list中確實刪除了,但現在widget2的key變成了1
當fultter執行diff算法的時候,由於它是根據前後widget的key是否變化來判斷的
而widget2的key是1,fultter會認爲原來key爲1的那個widget(就是widget1)沒有變化,所以不更新,而刪除掉原來key爲2的widget(就是widget2)。

知道了原因後,爲每個widget加上一個uuid,問題就解決了:

圖片描述

注:如果widget是stateless的,不加key也能夠正確刪除。
可能的原因大概是stageless的widget每次都需要重新繪製,因此不管key變不變化都是重繪的,而stateful則是根據state有沒有變化來重繪,這樣由於key沒有變所以state也沒有改變。
但是作爲開發者的我們,都應該養成添加key的習慣。

如有錯誤,還望指出!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章