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

Flutter TextFormField输入负号触发Invalid double异常如何解决

问题根因

异常触发逻辑非常明确:用户输入是动态过程,当仅输入负号-时,当前输入框的字符串值只有单个-,不属于double.parse可识别的合法浮点数字符串,直接调用解析必然抛出格式异常。
另外原有输入过滤正则存在漏洞:\-*规则允许匹配0到多个连续负号,会放行---12.34这类完全非法的输入内容,进一步增加了解析报错的概率。

修复方案

做两处调整即可彻底解决问题:

  • 修正输入过滤正则:把多负号匹配规则改为仅允许字符串最开头出现0或1个负号,从输入层拦截非法格式。如果是纬度输入场景,可以直接把整数位限制在2位,匹配纬度-90~90的取值范围。
  • 增加解析容错逻辑:用double.tryParse替换double.parse,针对输入过程中出现的临时不完整值(比如单独的-、末尾带小数点的-23.等)做安全解析,解析失败时跳过赋值即可,不会触发异常。
修正后示例代码
TextFormField(
   decoration: InputDecoration(
     labelText: 'Coordination - Latitude',
   ),
   inputFormatters: [
     FilteringTextInputFormatter.allow(
         // 适配纬度输入规则:仅开头可出现1个负号,整数位最多2位,小数点后最多4位
         RegExp(r'^-?\d{0,2}\.?\d{0,4}'))
   ],
   onChanged: (v) {
     // 安全解析,解析失败不赋值
     final value = double.tryParse(v);
     if (value != null) {
       lat(value);
     }
   },
 ),

如果不需要限制纬度取值范围,仅需要支持任意带负号的小数输入,可以把正则替换为r'^-?\d*\.?\d{0,4}'即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:12:23