问题描述
我有 3 个 TextFormField,如下所示:
这是上面3个TextFormField的代码:
class _ProposalDataInsuranceState extends State<ProposalDataInsurance> {
final _totalPremiController = TextEditingController();
final _premiPokokController = TextEditingController();
final _premiTopUpController = TextEditingController();
@override
void dispose() {
_totalPremiController.dispose();
_premiPokokController.dispose();
_premiTopUpController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(
children: [
TextFormField(
textInputAction: TextInputAction.next,style:
textMediumColor(Modular.get<ColorPalettes>().black),controller: _totalPremiController,maxLines: 1,keyboardType: TextInputType.number,inputFormatters: [
FilteringTextInputFormatter.digitsOnly,CurrencyInputFormatter(maxDigits: 16),],decoration: Inputdecoration(
border: InputBorder.none,focusedBorder: InputBorder.none,enabledBorder: InputBorder.none,errorBorder: InputBorder.none,disabledBorder: InputBorder.none,contentPadding:
EdgeInsets.only(bottom: 11,top: 11,right: 15),hintText: '0',hintStyle:
textMediumColor(Modular.get<ColorPalettes>().black),),TextFormField(
controller: _premiPokokController,textInputAction: TextInputAction.next,style: textMediumColor(Modular.get<ColorPalettes>().black),TextFormField(
controller: _premiTopUpController,textInputAction: TextInputAction.done,);
}
}
问题是,如何为 Total Premi
设置带有验证 (Premi Pokok
- Premi Topup
) 的默认值?
例如:
- 如果我在
50000
中添加Total Premi
,那么Premi Pokok
的值仍然是0
因为Total Premi
-Premi Pokok
是 {{ 1}} -50000
=0
。 - 如果我在
0
中添加50000
,在Total Premi
中添加40000
,那么Premi Pokok
的值是Premi Pokok
因为 {{ 1}} -10000
是Total Premi
-Premi Pokok
=50000
。 - 并且
40000
仍然可以由用户编辑该值,尽管具有从10000
-Premi Topup
验证的默认值。
解决方法
在totalpremitopup的改变上
使用
setState((){
var a=int.parse(totalpremipopup.text)
var b=int.parse(Premipokpok.text)
var c=a-b
premitopup.text=c.toString()
})
在 premiokok 中同样不变
使用
setState((){
var a=int.parse(totalpremipopup.text)
var b=int.parse(Premipokpok.text)
var c=a-b
premitopup.text=c.toString()
})
我希望这有效
,您可以为文本字段控制器设置侦听器。
你可以这样做:
...
void setPremiTopUpDefault() {
final totalPremi = int.tryParse(_totalPremiController.text);
final premiPokok = int.tryParse(_premiPokokController.text);
if (totalPremi != null && premiPokok != null) {
_premiTopUpController.text = (totalPremi - premiPokok).toString();
}
}
@override
void initState() {
super.initState();
_totalPremiController.addListener(setPremiTopUpDefault);
_premiPokokController.addListener(setPremiTopUpDefault);
}
@override
void dispose() {
_totalPremiController.removeListener(setPremiTopUpDefault);
_premiPokokController.removeListener(setPremiTopUpDefault);
...
}
...