Flutter изменение значения с плавающей точкой
День добрый
В моем приложении товар добавляется по десятичному числу, то есть 0.1
Увеличить или уменьшить через кнопки, я сделал все ок
Но когда пользователь вручную вводит число, кнопки перестают его изменять!!
Как это можно решить?
как перевести полученные данные из TextFild в double записать их в переменную value что бы можно было изменять значение как с помощью кнопок, так и с помощью ручного ввода
<pre>
@override
State<Couner> createState() => _CounerState();
}
class _CounerState extends State<Couner> {
late dynamic value = 0.5;
var hintText = 0.5;
double useNamber = 0.0;
void add() {
setState(() {
if (value <= widget.item) {
value = value + 0.1;
}
});
}
void remove() {
setState(() {
if (value > 0.5) {
value = value - 0.1;
}
});
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ElevatedButton(
onPressed: add,
child: const Icon(Icons.add),
),
Expanded(
child: TextField(
textAlign: TextAlign.center,
keyboardType: TextInputType.number,
onSubmitted: (useNamber) {
setState(() {
value = double.parse(useNamber);
});
},
decoration: InputDecoration(
hintText: '${value.toStringAsFixed(1)}',
),
),
),
ElevatedButton(
onPressed: remove,
child: const Icon(Icons.remove),
),
],
),
),
Expanded(
child: Text('${value.toStringAsFixed(1)}'),
),
],
);
}
}
</pre>
Ответы (1 шт):
Автор решения: MiT
→ Ссылка
Не самый красивый, но точно рабочий код:
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Couner(),
),
);
}
}
class Couner extends StatefulWidget {
const Couner();
@override
State<Couner> createState() => _CounerState();
}
class _CounerState extends State<Couner> {
late final TextEditingController controller = TextEditingController(text: value.toStringAsFixed(1));
double value = 0.5;
double hintText = 0.5;
double useNamber = 0.0;
void add() {
setState(() {
if (value <= 100) {
value = value + 0.1;
controller.text = value.toStringAsFixed(1);
}
});
}
void remove() {
setState(() {
if (value > 0.5) {
value = value - 0.1;
controller.text = value.toStringAsFixed(1);
}
});
}
void onUpdate(String useNamber) {
setState(() {
value = double.parse(useNamber);
controller.text = value.toStringAsFixed(1);
});
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ElevatedButton(
onPressed: add,
child: const Icon(Icons.add),
),
Expanded(
child: TextField(
controller: controller,
textAlign: TextAlign.center,
keyboardType: TextInputType.number,
onSubmitted: onUpdate,
decoration: InputDecoration(
hintText: controller.text,
),
),
),
ElevatedButton(
onPressed: remove,
child: const Icon(Icons.remove),
),
],
),
),
Expanded(
child: Text(controller.text),
),
],
);
}
}