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判定规则完全相反。
修复方案
- 去掉类成员
_bmi的final修饰符 calculateBMI方法中直接给类成员_bmi赋值,不要重新声明局部变量- 修正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
相关产品推荐
相关产品推荐

