Flutter热重启时build方法内print为何输出两次结果
问题描述
在Flutter开发时,在StatefulWidget的build方法中添加了打印变量value的print语句,但执行热重启(hot restart)操作后,控制台出现了两次打印结果。
相关实现代码如下:
class HomeScreen extends StatefulWidget { @override State<HomeScreen> createState() => _HomeScreenState(); } class _HomeScreenState extends State<HomeScreen> { bool value=true; @override Widget build(BuildContext context) { print(value); return Checkbox( value: value, onChanged: (value){ setState(() { this.value=value!; }); }); } }
原因说明
该现象是Flutter开发模式下热重启流程的正常表现,不属于代码逻辑错误,两次打印的触发来源分别是:
- 第一次打印来自热重启后的初始构建:热重启会清空应用全部运行时状态,从应用入口重新启动、挂载整个Widget树,遍历到
HomeScreen节点时,_HomeScreenState的build方法会被首次调用完成首帧渲染,触发第一次打印。 - 第二次打印来自热重启后的全局一致性重建:热重启流程收尾阶段,Flutter框架会强制触发一次全Widget树重建,保证界面渲染结果和最新代码完全对齐,避免热重启后出现UI与状态不匹配的问题,这一过程会让
HomeScreen的build方法再次执行,触发第二次打印。
该双次build调用仅存在于开发阶段的热重载、热重启流程中。生产环境下应用正常冷启动时,
build方法仅会在组件首次挂载、主动调用setState更新、父组件重建、依赖的InheritedWidget发生变化这几个场景触发,不会无故重复执行。
内容的提问来源于stack exchange,提问作者Irfan Ganatra
相关产品推荐
相关产品推荐

