ListView.builder开启reverse属性后添加新组件触发initState的问题求助
ListView.builder开启reverse属性后添加新组件触发initState的问题求助
我正在给我的App开发聊天模块,聊天内容区域是用ListView.builder来构建的,同时搭配BLoC和BlocBuilder,在触发SendButtonPressed事件时重建消息列表(目前先实现这个核心逻辑)。
之前在App其他使用ListView.builder的地方,我都会给子组件加上ValueKey,这样Flutter对比新旧列表元素时就能复用对应的组件——我还特意用一个包含initState和print语句的StatefulWidget做过验证:正常情况下添加新消息时,只有组件的build方法会被调用,不会触发initState。
但现在开启reverse属性后就遇到了棘手的问题!我需要用reverse让列表从下往上渲染,同时新消息要加到列表的底部(也就是视觉上聊天框的最下方)。结果这会导致列表里每个元素的索引都发生移位,哪怕我用消息的唯一ID作为ValueKey,Flutter还是会调用已有消息子组件的initState,这完全不符合预期。
我试过如果关掉reverse,新消息用追加而非前置的方式添加,这个问题就消失了,但我确实需要reverse带来的那种列表布局和滚动行为。有没有办法既能保留reverse的效果,又能避免已有消息的子组件重复触发initState呢?
内容来源于stack exchange
相关产品推荐
相关产品推荐

