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
相关产品推荐
相关产品推荐

