#android #flutter #setstate
Вопрос:
У меня есть два текстовых поля, которые принимают ввод чисел. Я хочу рассчитать сумму двух текстовых полей, в то время как пользователь вводит числа в текстовые поля и в режиме реального времени показывает результаты в третьем текстовом поле. Это то, что я пробовал до сих пор.
void _calculation() {
setState((){
_total = int.parse(_quantityController.text) * int.parse(feedPrice.text);
},
);
print(_total);
}
И покажите результат в третьем текстовом поле
TextField(
readOnly: true,
textAlign: TextAlign.center,
decoration: InputDecoration(
hintText: _total.toString(),
),
),
Я передаю итог в виде строки в поле подсказки текстового поля. Что я упускаю или что я делаю не так?
Комментарии:
1. Вам нужно вызвать
_calculation()
внутренниеonChanged
свойства обоих другихTextField
s2. Моя проблема немного более сложна, чем то, как я ее сформулировал. Поэтому я задам его как новый вопрос. Я оставлю этот вопрос и этот ответ здесь для тех, кто хочет ссылаться на него в будущем.
Ответ №1:
вы неправильно настраиваете hintText .Потому что текст подсказки, который подсказывает, какой тип ввода принимает поле.
вы должны установить текст в текстовое поле вместо hinttext, как это
текст:_total.toString()
Комментарии:
1. Я просто попробовал это, и это не сработало.
2. зачем ты положил этот код
3. вам нужно будет поместить код в третье текстовое поле
4. Если вы хотите этого, когда вы изменяете значение любого текстового файла, который у вас есть, и получаете обновленный результат sum в третьем textview. Вы должны добавить прослушиватель как в текстовом представлении, так и в методе прослушивателя onchanged или что-то в этом роде . Вы должны вызвать функцию calculation() в их и установить значение в текстовом поле три в функции вычисления
Ответ №2:
Демонстрационный Виджет
class ApplicantsX extends StatefulWidget {
const ApplicantsX({Key? key}) : super(key: key);
@override
State<ApplicantsX> createState() => _ApplicantsXState();
}
class _ApplicantsXState extends State<ApplicantsX> {
double a = 0;
double b = 0;
final TextEditingController controller = TextEditingController();
@override
void dispose() {
controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(
children: [
TextField(onChanged: (value) {
final x = double.tryParse(value);
setState(() {
a = x ?? 0; // handle null and String
controller.text = (a b).toStringAsFixed(2);
});
}),
TextField(onChanged: (value) {
final x = double.tryParse(value);
setState(() {
b = x ?? 0;
controller.text = (a b).toStringAsFixed(2);
});
}),
TextField(
controller: controller,
readOnly: true,
)
],
);
}
}
Ответ №3:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class _YourPageState extends State<YourPage> {
int _age1 = 0, _age2 = 0, _totalAge = 0;
final firstNumber = TextEditingController();
final secondNumber = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Padding(
padding: const EdgeInsets.all(32.0),
child: Column(
children: <Widget>[
TextField(
controller: firstNumber,
textInputAction: TextInputAction.next,
keyboardType: TextInputType.number,
onSubmitted: (String value) {},
),
TextField(
controller: secondNumber,
textInputAction: TextInputAction.next,
keyboardType: TextInputType.number,
onSubmitted: (String value) {},
),
Text(
'Sum is: ${firstNumber.text secondNumber.text}',
textAlign: TextAlign.center,
style: const TextStyle(fontWeight: FontWeight.bold),
)
],
),
),
);
}
}
Комментарии:
1. Я не пробовал этот ответ, но, прочитав его, я понял, что это, вероятно, самый простой ответ, который здесь сработает. Дело в том, что моя проблема немного более сложна, чем то, как я ее сформулировал. Поэтому я задам его как новый вопрос. Я оставлю этот вопрос и этот ответ здесь для тех, кто хочет ссылаться на него в будущем.