You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:00:25