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

Dart/Flutter BMI计算器BMI值正确但体重分类结果错误如何解决

问题原因
  • 变量作用域冲突+成员变量不可修改
    你在类中定义的final double _bmi = 0;是全局实例成员,首先final修饰符决定了它初始化后就不能被修改。其次你在calculateBMI方法中用double _bmi = xxx的写法,是重新声明了一个和类成员同名的局部变量,这个局部变量仅在calculateBMI方法内生效,完全不会修改类成员_bmi的值。因此getResult、getInterpretation方法读取的永远是类成员_bmi的初始值0,0始终小于18.5,所以永远返回Underweight对应的结果。
  • BMI判定逻辑倒置
    当前getResult的判断逻辑错误:小于18.5的情况被判定为Normal,18.5~25区间反而被判定为Underweight,和标准BMI判定规则完全相反。
修复方案
  1. 去掉类成员_bmi的final修饰符
  2. calculateBMI方法中直接给类成员_bmi赋值,不要重新声明局部变量
  3. 修正BMI判定逻辑的判断顺序和返回值
修复后完整代码
import 'dart:math';

// 可选优化:修正类名拼写错误,原类名Calcuator少了一个l,正确拼写为Calculator
class CalculatorBrain {
  CalculatorBrain({this.height, this.weight});

  final int? height;
  final int? weight;

  // 去掉final修饰
  double _bmi = 0;

  String calculateBMI() {
    // 直接给类成员_bmi赋值,不要前面加double重新声明局部变量
    _bmi = weight! / pow(height! / 100, 2);
    return _bmi.toStringAsFixed(1);
  }

  String getResult() {
    if (_bmi >= 25) {
      return 'Overweight';
    } else if (_bmi >= 18.5) {
      return 'Normal';
    } else {
      return 'Underweight';
    }
  }

  String getInterpretation() {
    if (_bmi >= 25) {
      return 'Try to exercise more.';
    } else if (_bmi >= 18.5) {
      return 'Good job,';
    } else {
      return 'You can eat a bit more.';
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:54:04