ListView.builder子组件:Stateless与Stateful该如何选择?
ListView.builder子组件:Stateless vs Stateful 选型建议
注意:本文仅讨论
ListView.builder的子组件选型,而非通用场景下Stateless与Stateful组件的对比。
无状态(Stateless)子组件
- 优点:自身不维护状态,大型列表里的子组件能被快速复用,实现逻辑更简洁。
- 缺点:任何子组件的状态变更都要在父级
ListView上调用setState,会触发整个列表的重建,数据量大时性能损耗明显。
有状态(Stateful)子组件
- 优点:符合Flutter性能最佳实践,可在子组件内部调用
setState做局部更新,相比刷新整个列表,性能影响小很多,适合处理每行独立的交互逻辑。 - 误区澄清:并非完全无法复用——只要给子组件设置合适的
Key,ListView.builder依然可以复用Stateful组件的Element,只是每个复用的Element会保留自身独立的状态,不会因为复用丢失状态。
推荐方案
- 若子组件几乎没有独立状态,所有数据都依赖父组件统一管理,选Stateless子组件即可,复用性好,代码更清爽。
- 若子组件需要处理独立的交互(比如每行的勾选状态、展开折叠、输入框内容等),优先用Stateful子组件,局部更新的性能优势很明显,合理设置Key后也能正常复用组件,不用担心复用问题。
内容的提问来源于stack exchange,提问作者Hammerhead
相关产品推荐
相关产品推荐

