Я получаю сообщение об ошибке «неисключенное нулевое значение» (Flutter)

#flutter #dart

#флаттер #dart

Вопрос:

Я хотел сделать простой калькулятор. Я хотел сделать все это в одной функции вместо того, чтобы определять функции отдельно для каждой операции, но я получаю сообщение об ошибке, и я не мог понять, почему я получаю эту ошибку.

   late num numberOne, numberTwo;
  String result = '';

  mathFunction(String text) {
    if (textControllerTwo != '0') {
      numberOne = num.tryParse(textControllerOne.text)!;
      numberTwo = num.tryParse(textControllerTwo.text)!;

      switch (text) {
        case 'collection':
          return result = (numberOne   numberTwo).toString();
        case 'interest':
          return result = (numberOne - numberTwo).toString();
        case 'multiply':
          return result = (numberOne * numberTwo).toString();
        case 'divided':
          return result = (numberOne / numberTwo).toString();
      }
    } else {
      return result = 'Number cannot be divided by 0';
    }
    setState(() {});
  }
 

Комментарии:

1. Вам нужно добавить default: в свой коммутатор.

2. Появляется предупреждение; «Метка «defult» не используется. Попробуйте удалить метку или использовать ее в операторе ‘break’ или ‘continue’. »

3. используйте default . И num.tryParse может вернуться null . См. api.dart.dev/stable/2.13.4/dart-core/num/tryParse.html

4. Я не знал, что tryparse возвращает null. Спасибо за ответ.

Ответ №1:

  1. Добавьте default предложение к вашему switch заявлению.
  2. Укажите значение по умолчанию для каждого num значения из TryParse.
  3. Удалить setState(() {}); , потому что вы не должны указывать a side effect при вызове вашей функции / метода.
  4. Нет необходимости использовать переменную области видимости класса / файла ( numberOne , numberTwo , result ) для вашего кода области видимости функции.
  5. Укажите возвращаемый тип для вашей функции / метода.

вот ваш упрощенный код:

   // return a string result from mathFunction.
  String mathFunction(String text) {
    if (textControllerTwo != '0') {
      
      // Give 0 if parse failed.
      num numberOne = num.tryParse(textControllerOne.text)??0;
      num numberTwo = num.tryParse(textControllerTwo.text)??0;

      switch (text) {
        case 'collection':
          return (numberOne   numberTwo).toString();
        case 'interest':
          return (numberOne - numberTwo).toString();
        case 'multiply':
          return (numberOne * numberTwo).toString();
        case 'divided':
          return (numberOne / numberTwo).toString();
        default:
          return "ERR"; 
      }
    } else {
      return 'Number cannot be divided by 0';
    }
  }
 

Комментарии:

1. Это исправило ошибку, но нажатие кнопки не работает. Как я могу это решить? <код>ElevatedButton(нажата: MathFunction(‘plus’), дочерний элемент: const Text(‘Plus’),) </code> <код> buttonFunction(Текст строки) { setState(() => MathFunction(текст)); } </code>

2. onPressed свойство необходимо void Function , но mathFunction оно есть String Function , отсюда и проблема. Вы можете использовать onPressed: () => mathFunction('plus'). But it still won't handle the result returned by the MathFunction`. Пожалуйста, смотрите dart.dev/guides/language/language-tour#a-basic-dart-program

3. спасибо за ответ

Ответ №2:

Лучше получить numberOne, numberTwo в аргументах методов и сделать их необязательными или использовать требуемые аннотации. убедитесь, что textControllerOne.text и textControllerTwo.text и text не равны нулю.

Комментарии:

1. К сожалению, это не сработало