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),
        ),
      ],
    );
  }
}
→ Ссылка