Flutter二次唤起输入框请求焦点触发setState调用异常问题
解决Flutter中点击唤起输入框请求焦点时的
setState() called after dispose错误 错误原因
点击Cancel按钮隐藏输入框时,Visibility组件会将子Widget(TextFormField)从组件树中移除,其对应的State会被dispose。再次点击Create按钮唤起输入框时,若在setState内部直接调用inputFocus.requestFocus(),此时TextFormField尚未完成重建挂载,焦点请求操作会触发已被dispose的TextFormField State执行setState,从而抛出错误。此外原代码未释放FocusNode和TextEditingController,存在内存泄漏风险。
解决方案
1. 延迟请求焦点,确保Widget已挂载
将焦点请求逻辑放在当前帧绘制完成后执行,保证TextFormField已重建并加入组件树:
TextButton( child: Text('Create new list'), onPressed: () { setState(() { addingNewList = true; }); // 等待UI帧绘制完成后再请求焦点 WidgetsBinding.instance.addPostFrameCallback((_) { if (mounted && inputFocus.canRequestFocus) { inputFocus.requestFocus(); } }); }, ),
2. 释放资源,避免内存泄漏
重写State的dispose方法,释放TextEditingController和FocusNode:
@override void dispose() { inputController.dispose(); inputFocus.dispose(); super.dispose(); }
为什么之前的尝试无效?
- 仅检查
canRequestFocus无法确保Widget已挂载到组件树,必须同时验证当前State的mounted状态。 - 直接将焦点请求移出
setState但未等待Widget重建,此时TextFormField仍未加入组件树,请求焦点依然会触发错误。
内容的提问来源于stack exchange,提问作者Linesofcode
相关产品推荐
相关产品推荐

