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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:24:23