Flutter清空TextFormField时触发FormatException异常如何修复
问题根因
异常触发逻辑非常明确:当你清空输入框时,onChanged回调接收到的文本是空字符串,直接执行int.parse('')无法将空字符串转为整数,就会抛出你看到的FormatException。原有代码只处理了输入为有效数字的正常场景,完全没覆盖输入为空、输入非数字的边界情况,所以清空操作就会触发报错。
修复方法
核心是给输入解析加前置校验,用不会抛异常的int.tryParse替代int.parse,解析失败时走兜底逻辑即可,修改后的完整代码如下:
// 需提前引入输入限制相关的依赖,使用inputFormatters时必须导入 // import 'package:flutter/services.dart'; int _currentSliderValue = 1; // 初始化控制器时直接赋值,避免初始状态输入框和滑块显示不一致 TextEditingController sliderController = TextEditingController(text: '1'); @override Widget build(BuildContext context) { return Column( children: [ Slider( value: _currentSliderValue.toDouble(), max: 100, min: 0, label: _currentSliderValue.round().toString(), onChanged: (double value) { setState(() { _currentSliderValue = value.toInt(); sliderController.text = _currentSliderValue.toString(); }); }, ), Padding( padding: const EdgeInsets.all(0.0), child: TextFormField( decoration: InputDecoration( border: OutlineInputBorder(), ), // 调起数字键盘,降低用户输入非数字内容的概率 keyboardType: TextInputType.number, // 可选:添加输入限制,只允许输入数字,从源头拦截非法字符 inputFormatters: [ FilteringTextInputFormatter.digitsOnly, ], controller: sliderController, onChanged: (text) { setState(() { // 输入为空时直接设置默认值,不执行解析 if (text.trim().isEmpty) { _currentSliderValue = 1; return; } // 安全解析输入值,解析失败返回null不会抛异常 final inputValue = int.tryParse(text); if (inputValue != null) { // 截断数值到滑块允许的0-100区间,避免滑块越界报错 _currentSliderValue = inputValue.clamp(0, 100); } else { // 输入为非合法数字时重置为默认值 _currentSliderValue = 1; } }); }, ), ), ], ); }
说明
- 上述代码中的默认值
1可以根据业务需求自行调整,比如空输入时设置为滑块最小值0也可以 - 如果不需要严格限制输入为纯数字,可以移除
inputFormatters配置,只要保留tryParse的校验逻辑即可避免解析异常
内容的提问来源于stack exchange,提问作者Elam
相关产品推荐
相关产品推荐

