Я создал один виджет для ввода любой суммы (валюты). При вводе суммы она должна быть автоматически отформатирована, например, 10000 should be 10,000
. Для форматирования текста в качестве валюты я использую пакет под названием flutter_money_formatter
. Этот пакет отлично работает, но когда я использую его для форматирования текста для TextFormField, он не дает правильного результата, как вы можете видеть на прикрепленном изображении.
Следующий код предназначен для виджета текстового поля.
Здесь я форматирую значение внутри метода изменения ввода, используя контроллер (думаю, это не лучший способ). Я думаю, что проблема заключается в этом.
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;
}
Буду признателен за любую помощь ...