egret-labs / egret-core

Egret is a brand new open mobile game and application engine which allows you to quickly build mobile games and apps on Android,iOS and Windows.
http://www.egret.com
Other
3.9k stars 787 forks source link

Scroller+dataGroup虚拟布局的bug #406

Open Japper opened 3 years ago

Japper commented 3 years ago

使用Scroller+dataGroup组合创建一个纵向的滑动列表(不知道别的会不会有bug) 默认使用虚拟布局 创建超过可显示范围数量的item,例如可显示6个,创建12个 理论上该dataGroup的numChildren会是6个 但是当你向上滑动列表之后 refresh该dataGroup,numchildren会变得很多(为什么不是12个,我下面会说到) 但是如果你不滑动该列表,直接refresh这个dataGroup,numchildren就是正常的6个

我进入你们的引擎源码一点点摸索,最终发现 当我滑动了这个列表,会将一个叫做 $dataProviderChanged 的变量置为true 然后refresh的时候,会检测这个变量是否为true,如果true,会将该列表的ScrollV和ScrollH置为0 也就是传说中的自动置顶 然后这里就出问题了 在置顶的ScrollV的setter中,重新刷新了整个列表的视图(本来是没有问题的) 但是!!! 此时没有拿到TypicalHeight 也不对,应该是TypicalHeight刚刚被置为了默认值22 而且还没有走 measureRendererSize 之类的方法, 导致系统在ScrollV的setter中,刷新列表视图的时候,使用的是默认值22,而不是真实的itemRenderer的高度 于是创建了冗余的itemRenderer

但是这个bug很难被发现。。。 毕竟不滑动直接refresh dataGroup是正常的 只有滑动过之后,再refresh,才会额外创建itemRenderer

至于一开始举的例子为什么不是12个全部被创建,这个跟你的视图高度和默认值22的比值有关。。。 也不是绝对的将 数据源 中的 所有数据 全部创建为itemRenderer

总之,期待你们的回复~ PS:有没有跟refresh对标的,不改变数据源,但是刷新数据,但又不改变当前滑动高度的方法? 目前只能,通过replaceAll传入相同数据源,来实现,有点点蠢

辛苦啦~