GetX实现底部导航跳转时触发FutureBuilder构建期setState报错如何解决
问题原因
该报错的核心是你在Flutter的Widget构建阶段执行了会触发视图更新的操作:Get.to()内部会修改路由栈、触发页面刷新,而你当前的判断跳转逻辑直接写在了build方法或者FutureBuilder的builder回调中,这两个执行时机都属于构建流程,不允许执行这类修改视图的操作。
解决方案
- 方案1:将导航操作延后到当前帧构建完成后执行
可以用WidgetsBinding.instance.addPostFrameCallback包裹导航逻辑,确保构建流程结束后再执行跳转,修改后代码如下:
也可以用更简便的else if (selectedPage == 3) { WidgetsBinding.instance.addPostFrameCallback((_) { Get.to(VideoViewDetail(id: '1465')); }); }Future.delayed写法,效果一致:else if (selectedPage == 3) { Future.delayed(Duration.zero, () => Get.to(VideoViewDetail(id: '1465'))); } - 方案2:调整跳转逻辑的存放位置
底部导航的页面选中逻辑本就不该放在build方法中,你可以直接将这段判断迁移到底部导航组件的onTap交互回调中。交互回调属于用户事件触发时机,不在构建流程内,不会触发该报错,是更符合开发规范的写法。 - 方案3:排查目标页面的构建逻辑
如果上述修改完成后仍有报错,需要检查VideoViewDetail页面的build方法/initState中是否存在直接调用setState、GetX状态更新的逻辑,如果有也需要用上述延后执行的方式处理。
内容的提问来源于stack exchange,提问作者gegentierversuche
相关产品推荐
相关产品推荐

