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

Flutter中首次输入时PIN输入框不显示数字的求助

问题描述

我的代码:

Padding(
  padding: const EdgeInsets.only(bottom: 3.0),
  child: SizedBox(
    width: double.infinity,
    child: GestureDetector(
      onTap: () {},
      child: Form(
        child: TextFormField(
          inputFormatters: <TextInputFormatter>[
            FilteringTextInputFormatter.digitsOnly,
          ],
          keyboardType: TextInputType.number,
          controller: TextEditingController(text: formData.pin),
          decoration: const InputDecoration(
            border: UnderlineInputBorder(),
            labelText: 'PIN 2',
          ),
          onChanged: (newValue) => formData.pin = newValue,
        ),
      ),
    ),
  ),
),

问题:首次输入时PIN输入框无法显示数字,必须再次点击输入框后数字才能正常显示,录屏演示:
屏幕录制

期望实现:首次输入时PIN输入框就能正常显示输入的数字

解决方案

问题根源在于你每次Widget构建时都创建新的TextEditingController实例,导致输入框的状态无法稳定绑定,首次输入时控制器实例可能被重建,无法同步输入内容。

修改步骤:

  • 在State类中声明并保留TextEditingController的引用,禁止在build方法内临时创建。
  • 在initState生命周期中初始化控制器,将formData.pin设为初始值。
  • 在dispose方法中销毁控制器,避免内存泄漏。
  • 若formData.pin存在外部更新,需同步更新控制器的text属性。

修改后的代码示例:

// 在你的State类中添加控制器变量
late final TextEditingController _pinController;

@override
void initState() {
  super.initState();
  // 初始化控制器并设置初始值
  _pinController = TextEditingController(text: formData.pin);
}

@override
void dispose() {
  // 销毁控制器释放资源
  _pinController.dispose();
  super.dispose();
}

// build方法中的TextFormField部分
Padding(
  padding: const EdgeInsets.only(bottom: 3.0),
  child: SizedBox(
    width: double.infinity,
    child: GestureDetector(
      onTap: () {},
      child: Form(
        child: TextFormField(
          inputFormatters: <TextInputFormatter>[
            FilteringTextInputFormatter.digitsOnly,
          ],
          keyboardType: TextInputType.number,
          controller: _pinController, // 使用保存的控制器实例
          decoration: const InputDecoration(
            border: UnderlineInputBorder(),
            labelText: 'PIN 2',
          ),
          onChanged: (newValue) {
            formData.pin = newValue;
            // 若使用状态管理工具,可在此监听formData变化,同步更新控制器文本
          },
        ),
      ),
    ),
  ),
),

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:00:15