我正在创建一个应用,其中一项功能是更新文本字段 基于其他文本字段的更改。
这些字段涉及以下产品的价格:美元,欧元,雷亚尔。
如果用户更改了美元价格,则欧元和实际价格也是如此,依此类推...
问题是,如果我使用正常的TextEditingController都可以正常工作,但是如果我使用flutter_masked_text包中的MoneyMaskedTextController,更新将停止。
有人可以测试我的代码并回答我为什么使用MoneyMaskedTextController停止更新吗?
要进行测试,请不要忘记在pubspec.yaml中安装flutter_masked_text:^ 0.8.0。
如果我不能使用flutter_masked_text,该如何使用掩码和更新文本字段?
谢谢。
import 'package:flutter/material.dart';
import 'package:flutter_masked_text/flutter_masked_text.dart';
void main() {
runApp(MaterialApp(
home: ProductType(),
));
}
class ProductType extends StatefulWidget {
_ProductTypeScreen createState() => _ProductTypeScreen();
}
class _ProductTypeScreen extends State<ProductType> {
@override
Widget build(BuildContext context) {
double dollarRate = 3.70;
double euroRate = 4.20;
//Normal controllers
/* final ctrl_real = TextEditingController();
final ctrl_dollar = TextEditingController();
final ctrl_euro = TextEditingController();*/
//Money Mask controllers
final ctrl_real = MoneyMaskedTextController();
final ctrl_dollar = MoneyMaskedTextController();
final ctrl_euro = MoneyMaskedTextController();
void change_real(String text) {
double real = double.parse(text);
ctrl_dollar.text = (real / dollarRate).toString();
ctrl_euro.text = (real / euroRate).toString();
}
void change_dollar(String text) {
double dolar = double.parse(text);
ctrl_real.text = (dolar * dollarRate).toString();
ctrl_euro.text = (dolar * dollarRate / euroRate).toString();
}
void change_euro(String text) {
double euro = double.parse(text);
ctrl_real.text = (euro * euroRate).toString();
ctrl_dollar.text = (euro * euroRate / dollarRate).toString();
}
return Scaffold(
body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Container(
width: 160.0,
height: 200.0,
padding: EdgeInsets.all(20.0),
child: TextField(
controller: ctrl_euro,
decoration: InputDecoration(
labelText: "Euro price",
prefixText: "€"),
onChanged: change_euro,
keyboardType: TextInputType.numberWithOptions(
decimal: true),
)),
Container(
width: 160.0,
height: 200.0,
padding: EdgeInsets.all(20.0),
child: TextField(
controller: ctrl_dollar,
decoration: InputDecoration(
labelText: "Dolar price",
prefixText: "US\$"),
onChanged: change_dollar,
keyboardType: TextInputType.numberWithOptions(
decimal: true),
)),
Container(
width: 160.0,
height: 200.0,
padding: EdgeInsets.all(20.0),
child: TextField(
controller: ctrl_real,
decoration: InputDecoration(
labelText: "Real price",
prefixText: "R\$"),
onChanged: change_real,
keyboardType: TextInputType.numberWithOptions(
decimal: true),
)),
]
)
)
);
}
}
答案 0 :(得分:1)
如果检查每种方法收到的值,则十进制值中将出现一个逗号“,”。
void change_real(String text) {
print("Text : $text");
}
因此,每次您尝试解析这些值时,它都会在此处崩溃:
double real = double.parse(text);
解决问题的一种方法是将小数分隔符更改为“。” ,就像这样:
final ctrl_real = MoneyMaskedTextController(decimalSeparator: ".");
final ctrl_dollar = MoneyMaskedTextController(decimalSeparator: ".");
final ctrl_euro = MoneyMaskedTextController(decimalSeparator: ".");