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

Flutter中TextFormField输入内容后按钮未自动显示,热重载才出现

解决输入框输入后按钮不自动显示的问题

你现在的代码只在组件首次构建时检查输入框的文本内容,用户输入过程中UI不会自动刷新,所以按钮不会实时显示——热重载相当于重新执行构建逻辑,这时才会检测到文本变化并显示按钮。

下面是两种可行的解决方法:

方法一:给TextEditingController添加监听器

通过监听控制器的文本变化,触发UI重建:

class YourPage extends StatefulWidget {
  @override
  _YourPageState createState() => _YourPageState();
}

class _YourPageState extends State<YourPage> {
  final TextEditingController _weight = TextEditingController();

  @override
  void initState() {
    super.initState();
    // 监听文本变化,触发状态更新
    _weight.addListener(() {
      setState(() {});
    });
  }

  @override
  void dispose() {
    // 销毁控制器,避免内存泄漏
    _weight.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          TextFormField(
            controller: _weight,
            keyboardType: TextInputType.number,
          ),
          // 原有的按钮判断逻辑
          if (_weight.text.contains(RegExp(r'[0-9]')))
            Padding(
              padding: const EdgeInsets.only(bottom: 20),
              child: BMIButton(
                onpressed: () {
                  Navigator.push(
                    context,
                    PageTransition(
                      type: PageTransitionType.rightToLeft,
                      child: BMIHeight(),
                      inheritTheme: true,
                      ctx: context,
                    ),
                  );
                },
              ),
            ),
        ],
      ),
    );
  }
}

方法二:利用TextFormField的onChanged回调

直接在输入变化时调用setState更新UI:

TextFormField(
  controller: _weight,
  keyboardType: TextInputType.number,
  // 输入变化时触发状态更新
  onChanged: (value) {
    setState(() {});
  },
),

两种方法都能让UI在用户输入时自动重建,从而实时检测文本内容并显示按钮。

内容的提问来源于stack exchange,提问作者ckot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:50:21