Флаттер форматирование текста деньги с TextFormField - PullRequest
0 голосов
/ 05 апреля 2020

Я создал один виджет для ввода любой суммы (валюты). При вводе суммы она должна быть автоматически отформатирована, например, 10000 should be 10,000. Для форматирования текста в качестве валюты я использую пакет под названием flutter_money_formatter. Этот пакет отлично работает, но когда я использую его для форматирования текста для TextFormField, он не дает правильного результата, как вы можете видеть на прикрепленном изображении. enter image description here

Следующий код предназначен для виджета текстового поля.

Здесь я форматирую значение внутри метода изменения ввода, используя контроллер (думаю, это не лучший способ). Я думаю, что проблема заключается в этом.

import 'package:bright_group_tuition/helpers/Utility.dart';
import 'package:flutter/material.dart';
import '../helpers/Validators.dart';

class RoundedMoneyTextFormField extends StatefulWidget {
  final String label;
  final Function onInput;
  final value;
  final Function onTap;
  final readOnly;

  RoundedMoneyTextFormField(
      {@required this.label,
      this.onInput,
      this.value,
      this.onTap,
      this.readOnly = false});

  @override
  _RoundedMoenyTextFromFieldState createState() =>
      _RoundedMoenyTextFromFieldState();
}

class _RoundedMoenyTextFromFieldState extends State<RoundedMoneyTextFormField> {
  final TextEditingController controller = TextEditingController();
  String storedValue;

  @override
  void initState() {
    controller.text = widget.value;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    storedValue = widget.value.toString();

    return Padding(
      padding: const EdgeInsets.only(top: 15),
      child: TextFormField(
        readOnly: widget.readOnly,
        controller: controller,
        onChanged: (String val) {
          widget.onInput(val);
          setState(() {
            controller.text = Utility.formatCurrency(val, withOutDecimal: true);
            controller.selection = TextSelection.fromPosition(
                TextPosition(offset: controller.text.length));
          });
        },
        onTap: widget.onTap,
        validator: (String val){
          if(val.isEmpty) {
            return 'This field is required';
          }

          if(!isNumeric(Utility.cleanCurrencyFormat(val))) {
            return 'Invalid number';
          }
          return null;
        },
        keyboardType: TextInputType.numberWithOptions(),
        maxLines: null,
        decoration: InputDecoration(
          border: OutlineInputBorder(
            borderRadius: const BorderRadius.all(
              const Radius.circular(10.0),
            ),
          ),
          filled: true,
          hintStyle: TextStyle(color: Colors.grey[800]),
          labelText: this.widget.label,
          fillColor: Colors.white70,
          alignLabelWithHint: true,
          isDense: true,
        ),
      ),
    );
  }
}

Следующий код предназначен для форматирования текста в качестве валюты. Этот код прекрасно работает везде, кроме созданного мною текстового поля.

static String formatCurrency(String amount,
      {bool withSymbol = false, bool withOutDecimal = false}) {
    FlutterMoneyFormatter fmf = FlutterMoneyFormatter(
      amount: double.tryParse(amount),
      settings: MoneyFormatterSettings(
        symbol: '₹',
        thousandSeparator: ',',
        decimalSeparator: '.',
        symbolAndNumberSeparator: ' ',
        fractionDigits: 2,
      ),
    );

    if (withSymbol) {
      return fmf.output.symbolOnLeft;
    }

    if (withOutDecimal) {
      return fmf.output.withoutFractionDigits;
    }

    return fmf.output.nonSymbol;
  }

Буду признателен за любую помощь ...

...