Решение математического выражения путем ввода текстового поля во Flutter
1.Краткое изложение моей проблемы Получение решения для следующего выражения: t4.text = ((secondValue - третье значение) - (firstValue - третье значение)). ToString(); Здесь по какой-то причине Flutter напрямую вычитает первое значение из второго и оставляет третье значение.
- Подробная информация о моей цели Использование текстовых полей для получения ввода от использования и отображения вывода в последнем текстовом поле
- Ожидаемые результаты Здесь t4, который является TextEditingController текстового поля 4, должен использовать всю формулу и отображать результат
- Фактические результаты Значение текстового поля 1 вычитается из текстового поля 2, и результат отображается в текстовом поле 4, текстовое поле 3 не используется.
-Что я пробовал до сих пор - Погуглил решение и попытался использовать некоторые пакеты, такие как math_expressions и т. Д., Но не смог понять это
-Вот код -
class Watchlist extends StatefulWidget {
@override
_WatchlistState createState() => _WatchlistState();
}
class _WatchlistState extends State<Watchlist> {
TextEditingController t1 = TextEditingController();
TextEditingController t2 = TextEditingController();
TextEditingController t3 = TextEditingController();
TextEditingController t4 = TextEditingController();
// List<bool> isSelected = [false, false];
bool long;
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [kCalculatorShadow] ,
borderRadius: BorderRadius.all(Radius.circular(10)),
),
margin: EdgeInsets.symmetric(vertical: MediaQuery.of(context).size.height * 0.060, horizontal: MediaQuery.of(context).size.width * 0.07),
child: Padding(
padding: EdgeInsets.symmetric(horizontal: MediaQuery.of(context).size.height * 0.025),
child: Column(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: MediaQuery.of(context).size.height*0.055),
TextField(
keyboardType: TextInputType.number,//style: TextStyle(fontWeight: FontWeight.w300, color: Colors.white),
cursorColor: Colors.blue[900], //Blinking cursor that comes when typing number
controller: t1,
onChanged: (value){
calculate();
},
decoration: InputDecoration(
labelText: 'Initial Price',
labelStyle: TextStyle(fontWeight: FontWeight.w400, color: appBarColor),
// fillColor: Colors.white,
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.blue[900],width: 2),
borderRadius: BorderRadius.circular(18.0),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.blue,width: 2),
borderRadius: BorderRadius.all(Radius.circular(30)),
),
),
),
SizedBox(height: MediaQuery.of(context).size.height*0.05),
TextField(
keyboardType: TextInputType.number,//style: TextStyle(fontWeight: FontWeight.w300, color: Colors.white),
cursorColor: Colors.blue[900], //Blinking cursor that comes when typing number
controller: t2,
onChanged: (value){
calculate();
},
decoration: InputDecoration(
labelText: 'Target Price',
labelStyle: TextStyle(fontWeight: FontWeight.w400, color: appBarColor),
// fillColor: Colors.white,
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.blue[900],width: 2),
borderRadius: BorderRadius.circular(18.0),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.blue,width: 2),
borderRadius: BorderRadius.all(Radius.circular(30)),
),
),
),
SizedBox(height: MediaQuery.of(context).size.height*0.05),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Container(
width: MediaQuery.of(context).size.width*0.37,
child: TextField(
keyboardType: TextInputType.number,//style: TextStyle(fontWeight: FontWeight.w300, color: Colors.white),
cursorColor: Colors.blue[900], //Blinking cursor that comes when typing number
controller: t3,
onChanged: (value){
calculate();
},
decoration: InputDecoration(
labelText: 'Maker/Taker Fee',
labelStyle: TextStyle(fontWeight: FontWeight.w400, color: Colors.redAccent,fontSize: MediaQuery.of(context).size.height*0.02),
// hintText: 'Default: 0.2',
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.red,width: 2),
borderRadius: BorderRadius.circular(18.0),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.red,width: 2),
borderRadius: BorderRadius.all(Radius.circular(30)),
),
),
),
// child: CustomInputTextField(labelText: 'Maker/Taker Fee', controller: t2)),
// SizedBox(height: MediaQuery.of(context).size.height*0.05
),
SizedBox(width: MediaQuery.of(context).size.width*0.01),
LiteRollingSwitch(
value: true,
textOn: 'Long',
textOff: 'Short',
colorOn: Colors.green,
colorOff: Colors.deepOrange,
iconOn: Icons.lightbulb_outline,
iconOff: Icons.power_settings_new,
animationDuration: const Duration(milliseconds: 200),
onChanged: (bool state) {
print('turned ${(state) ? 'Long On' : 'Short On'}');
if(state == true){ /// long will be used to switch case between which formula to use for calculation
long = true;
}else{
long = false;
}
},
),
],
),
SizedBox(height: MediaQuery.of(context).size.height*0.05),
]),
AbsorbPointer(
child: TextField(
keyboardType: TextInputType.number,//style: TextStyle(fontWeight: FontWeight.w300, color: Colors.white),
// cursorColor: Colors.blue[900], //Blinking cursor that comes when typing number
controller: t4,
onChanged: (value){
calculate();
},
decoration: InputDecoration(
labelText: 'Result',
labelStyle: TextStyle(fontWeight: FontWeight.w400, color: appBarColor),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.greenAccent,width: 2),
borderRadius: BorderRadius.circular(18.0),
),
),
),
),
SizedBox(height: MediaQuery.of(context).size.height*0.05),
]),
),
);
}
void calculate() {
if (t1.text.trim().isNotEmpty &&
t2.text.trim().isNotEmpty &&
t3.text.trim().isNotEmpty) {
if(long == true){
final firstValue = double.parse(t1.text);
final secondValue = double.parse(t2.text);
final thirdvalue = double.parse(t3.text);
t4.text = ((secondValue - thirdvalue) - (firstValue - thirdvalue)).toString();
}else{
final firstValue = double.parse(t1.text);
final secondValue = double.parse(t2.text);
final thirdvalue = double.parse(t3.text);
t4.text = (firstValue - secondValue -thirdvalue).toString();
}
}
}
}