使用TextFormField

时间:2020-04-05 08:45:21

标签: android flutter formatting flutter-dependencies

我已经创建了一个用于输入任何金额(货币)的小部件。输入金额时,应自动将其格式化,例如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;
  }

任何帮助将不胜感激...

0 个答案:

没有答案