Flutter中FutureBuilder调用Provider更新触发build时setState错误如何解决
报错原因
你在FutureBuilder的builder构建方法执行过程中直接调用了updateActualAccountId方法,该方法内部的notifyListeners()会触发所有依赖RegistrationHelper的组件重绘,但此时Flutter正处于组件构建的流程中,不允许在构建过程中触发新的重绘请求,因此抛出了该异常。
解决方法
推荐使用帧回调延迟执行Provider更新操作,修改你main.dart中嵌套的最内层FutureBuilder的对应代码即可:
if (snap.hasData) { // 将更新操作延迟到当前帧绘制完成后执行 WidgetsBinding.instance.addPostFrameCallback((_) { // 注意添加listen: false,避免不必要的监听 Provider.of<RegistrationHelper>(context, listen: false) .updateActualAccountId(snap.data['accountId']); }); }
原理说明
addPostFrameCallback会将传入的回调函数放到当前帧渲染完成后的任务队列中执行,此时组件构建流程已经完全结束,再调用notifyListeners()触发重绘不会和现有构建流程冲突,完美规避报错。
可选替代方案
如果你的业务场景下,更新accountId后不需要立刻触发所有关联组件重绘,也可以临时修改RegistrationHelper的更新逻辑,新增一个不触发notifyListeners()的赋值方法,等到合适的时机再手动调用通知更新,该方案可根据你的业务需求自行选择。
内容的提问来源于stack exchange,提问作者AturicLiqr
相关产品推荐
相关产品推荐

