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

添加计算代码后Flutter Navigator跳转失效,如何解决?

问题:添加BMI计算代码后Flutter Navigator无法跳转至ResultsPage

我在给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;
}

额外注意事项

  1. 参数类型校验:给getBMI的参数加上明确的类型标注(比如double),避免传入字符串等非数值类型导致运算错误。如果weight和height是从输入框获取的字符串,需要先转换为数值:
    // 假设weightText、heightText是从输入框拿到的字符串
    double weight = double.parse(weightText);
    double height = double.parse(heightText);
    String bmi = calculator.getBMI(weight, height);
    
  2. 规范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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:55:13