Flutter跳转第二屏触发FormatException异常导致页面无法加载如何解决
问题根因
- 第二页的
TextEditingController初始化时默认text属性为空字符串,你在第二页的initState生命周期、build渲染方法中提前调用了计算逻辑,还未等用户输入内容就执行了double.parse解析空字符串,直接触发格式异常,导致页面无法完成加载。 - 代码存在容错缺失:原生
double.parse方法只要遇到非数值格式内容(空字符串、字母、特殊符号)就会直接抛出异常,没有兼容非法输入的处理逻辑。 - 额外存在方法名不匹配问题:你定义的计算函数名为
calcul,但按钮onPressed中调用的是calculCredit,若实际代码未做对应函数定义,也会触发逻辑异常。
修复方案
- 调整计算逻辑触发时机:排查第二页的生命周期、build方法,移除页面加载阶段的计算逻辑调用,仅保留按钮点击事件中的计算触发。
- 替换解析方法增加容错:用
double.tryParse替代double.parse,解析失败时返回业务默认值,不会直接抛出崩溃:
// 明确参数类型为TextEditingController,避免dynamic类型带来的潜在问题 double calcul(TextEditingController salaire, TextEditingController valeurApport, TextEditingController moisRembours) { final salaireVal = double.tryParse(salaire.text) ?? 0.0; final valeurApportVal = double.tryParse(valeurApport.text) ?? 0.0; // 还款月数默认值设为1,避免除零异常 final moisRemboursVal = double.tryParse(moisRembours.text) ?? 1.0; double res = salaireVal - (valeurApportVal / moisRemboursVal); return res; }
- 点击按钮时先做输入合法性校验,不符合条件直接拦截计算:
child: MaterialButton( minWidth: double.infinity, height: 60, onPressed: () { // 校验薪资输入合法性 if (salaire.text.isEmpty || double.tryParse(salaire.text) == null) { // 可插入Toast/提示弹窗告知用户输入合法薪资 return; } // 校验购置价值输入合法性 if (valeurApport.text.isEmpty || double.tryParse(valeurApport.text) == null) { // 提示输入合法购置价值 return; } // 校验还款月数合法性,不能为0避免除零异常 if (moisRembours.text.isEmpty || double.tryParse(moisRembours.text) == null || double.parse(moisRembours.text) == 0) { // 提示输入合法还款月数 return; } // 校验通过后执行计算 final result = calcul(salaire, valeurApport, moisRembours); // 后续处理计算结果逻辑 }, // 其余按钮配置 )
- 统一方法命名:确保调用的函数名和实际定义的函数名一致,避免调用不存在的方法。
- 可选优化:给所有数值输入框设置
keyboardType: TextInputType.numberWithOptions(decimal: true),限制用户仅能输入数字,从源头减少非法输入概率。
内容的提问来源于stack exchange,提问作者Learning Code
相关产品推荐
相关产品推荐

