在做一个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的习惯。如有错误,还望指出!