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