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

