Мое приложение выбрасывает мне метод, который был вызван при нуле

#flutter #dart

#flutter #dart

Вопрос:

Я создал приложение и создаю простую логику. Но когда я запускаю его, он выбрасывает меня

 The method '>' was called on null.
Receiver: null
Tried calling: >(25)
  

Я имею в виду базовое математическое сравнение, я не знаю, почему оно меня так выдает, вот мой файл

 import 'dart:math';

class CalculatorBrain {
  CalculatorBrain({this.height, this.weight});

  final int height;
  final int weight;

  double _bmi;

  String calculateBMI() {
    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 'You have a higher than normal body weight. Try to exercise more';
    } else if (_bmi > 18.5) {
      return 'You have a normal body weight. Good job!';
    } else {
      return 'You have aa lower than normal body weight. You can eat a bit more.';
    }
  }
}

  

Можете ли вы помочь мне разобраться в этой ошибке?

Ответ №1:

В calculateBMI() вы объявляете новую локальную переменную _bmi , объявляя ее тип, поэтому _bmi поле класса CalculatorBrain по-прежнему равно null. Просто удалите объявление типа _bmi переменной в calculateBMI() . Вы также можете перейти calculateBMI() на getter и полностью удалить _bmi поле. И отметьте height и weight как обязательный. Также вы можете добавить утверждения, чтобы убедиться, что эти значения больше 0 и не равны нулю.

 import 'dart:math';
import 'meta'; 


class CalculatorBrain {
  CalculatorBrain({@required this.height,
                   @required  this.weight,
                  }) : assert(height > 0), assert(weight > 0);
  final int height;
  final int weight;


  double get _bmi => weight / pow(height / 100, 2);

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

  String getInterpretation() {
    if (_bmi >= 25) {
      return 'You have a higher than normal body weight. Try to exercise more';
    } else if (_bmi > 18.5) {
      return 'You have a normal body weight. Good job!';
    } else {
      return 'You have aa lower than normal body weight. You can eat a bit more.';
    }
  }
}
  

Ответ №2:

Возможно, вы вызываете getResult() или getInterpretation() перед присвоением значения _bmi .

Чтобы предотвратить это, вы можете проверить, _bmi есть null ли это, прежде чем сравнивать его. Вот пример для вашей getResult функции:

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