Flutter表单用StatelessWidget可显示错误,为何官方推荐StatefulWidget?
为什么你的StatelessWidget表单看起来能正常运行
你当前的代码能展示校验提示是因为开启了AutovalidateMode.onUserInteraction,且暂时没有触发UserForm组件的上层重建。但这个实现存在两个隐藏问题:
GlobalKey和TextEditingController直接定义在StatelessWidget中,只要父组件触发重绘导致UserFormrebuild,这两个实例就会被重新创建,之前的输入内容、表单校验状态会全部丢失,旋转手机屏幕、父组件调用setState都可以复现这个问题。- StatelessWidget没有
dispose生命周期回调,你无法主动释放TextEditingController,会造成内存泄漏。
官方示例使用StatefulWidget的核心原因是State实例会跨widget的build持久化存在:把GlobalKey、TextEditingController放在State中,就算组件 rebuild 也不会重新创建这些实例,状态可以被保留;同时你可以在State的dispose方法中释放控制器,避免内存泄漏。
StatelessWidget和StatefulWidget的适用场景
适合用StatelessWidget的场景
- 组件内容完全由传入的参数决定,自身不需要持有任何持久化状态,比如静态文本展示、固定样式的图标、纯展示类的列表项
- 组件不需要在多次build之间保留任何实例对象(比如控制器、key等)
- 组件内部不需要触发主动重绘
适合用StatefulWidget的场景
- 组件需要持有跨build的持久化状态,比如开关的选中状态、输入框内容、动画控制器、表单校验状态等
- 组件内部需要主动触发重绘(调用
setState更新界面) - 需要处理生命周期逻辑,比如初始化时请求数据、销毁时释放资源等
内容的提问来源于stack exchange,提问作者Ghost
相关产品推荐
相关产品推荐

