添加计算代码后Flutter Navigator跳转失效,如何解决?
我在给calculate_button的onTap回调添加了BMI计算代码后,Flutter的Navigator无法跳转到ResultsPage,相关代码如下:
按钮回调代码
calculate_button( onTap: () { CalculationBrain calculator = CalculationBrain(); String bmi = calculator.getBMI(weight, height); Navigator.push( context, MaterialPageRoute(builder: (context) => ResultsPage(bmi)), ); }, )
ResultsPage代码
class ResultsPage extends StatelessWidget { ResultsPage (this.bmi); String bmi; }
CalculationBrain的getBMI方法
String getBMI (weight, height) { String bmi = weight/pow(height/100, 2).toStringAsFixed(1); return bmi; }
原因分析与修复方案
核心问题:运算顺序错误导致运行时异常
getBMI方法的逻辑存在致命错误:你先对pow(height/100, 2)的数值结果调用toStringAsFixed(1),把它转成了字符串,随后试图用weight除以这个字符串——这会直接触发类型不匹配的运行时异常,代码执行到这里就会中断,后面的Navigator.push自然不会被执行。
修复后的getBMI方法
调整运算顺序,先计算BMI数值,再转成指定格式的字符串:
import 'dart:math'; // 确保导入pow所在的包 String getBMI(double weight, double height) { // 先完成BMI数值计算 double bmiValue = weight / pow(height / 100, 2); // 再将数值格式化为保留1位小数的字符串 String bmi = bmiValue.toStringAsFixed(1); return bmi; }
额外注意事项
- 参数类型校验:给
getBMI的参数加上明确的类型标注(比如double),避免传入字符串等非数值类型导致运算错误。如果weight和height是从输入框获取的字符串,需要先转换为数值:// 假设weightText、heightText是从输入框拿到的字符串 double weight = double.parse(weightText); double height = double.parse(heightText); String bmi = calculator.getBMI(weight, height); - 规范ResultsPage代码:给成员变量加上
final修饰,符合StatelessWidget不可变的设计原则:class ResultsPage extends StatelessWidget { const ResultsPage(this.bmi); final String bmi; @override Widget build(BuildContext context) { return Scaffold( body: Center(child: Text("BMI值:$bmi")), ); } }
修复以上问题后,onTap回调里的代码就能正常执行,Navigator也能顺利跳转到ResultsPage了。
内容的提问来源于stack exchange,提问作者cipano
相关产品推荐
相关产品推荐

