Flutter中initState()内为何要使用零时长的Future.delayed?
关于Flutter initState中零时长Future.delayed的作用说明
这个写法是Flutter开发里非常常见的实用技巧,核心作用是把回调逻辑延后到当前组件的同步生命周期执行完成、且组件已经正式挂载到渲染树之后再运行,具体解决的问题有两个:
- 规避initState阶段访问上下文的异常
initState执行的时候组件还没有完成挂载,此时如果直接执行依赖context的操作,哪怕你这里Provider用了listen:false,在部分旧版本Flutter或者复杂的组件树场景下,还是有可能出现上下文未初始化完成的报错。
而Future.delayed(Duration.zero)本质是把回调任务扔到Dart事件循环的微任务队列尾部,会等当前所有同步任务(包括initState、didChangeDependencies、第一帧构建逻辑)全部执行完成后再触发,此时context已经完全可用,调用Provider相关的方法就不会出现上下文无效的问题。 - 避免阻塞页面首帧渲染
如果loadValues方法内部有同步耗时逻辑,直接写在initState里会阻塞当前帧的构建,导致页面首次打开出现卡顿。放到零时长Future里之后,这部分逻辑会延后到首帧渲染完成后再执行,能让页面更快展示出来,提升加载体验。
补充:这个写法的效果和官方提供的
WidgetsBinding.instance.addPostFrameCallback基本一致,只是写法更简洁,不用额外调用WidgetsBinding的API。另外你贴的示例代码里有个小笔误,定义的变量名是Provider,后面调用的时候用的是productProvider,实际开发时要注意变量名统一。
内容的提问来源于stack exchange,提问作者rozerro
相关产品推荐
相关产品推荐

