#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.html4. Я не знал, что tryparse возвращает null. Спасибо за ответ.
Ответ №1:
- Добавьте
default
предложение к вашемуswitch
заявлению. - Укажите значение по умолчанию для каждого
num
значения из TryParse. - Удалить
setState(() {});
, потому что вы не должны указывать aside effect
при вызове вашей функции / метода. - Нет необходимости использовать переменную области видимости класса / файла (
numberOne
,numberTwo
,result
) для вашего кода области видимости функции. - Укажите возвращаемый тип для вашей функции / метода.
вот ваш упрощенный код:
// 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-program3. спасибо за ответ
Ответ №2:
Лучше получить numberOne, numberTwo в аргументах методов и сделать их необязательными или использовать требуемые аннотации. убедитесь, что textControllerOne.text и textControllerTwo.text и text не равны нулю.
Комментарии:
1. К сожалению, это не сработало