Flutter:将另一个 textformfield 的默认值设置为 textformfield

问题描述

我有 3 个 TextFormField,如下所示:

enter image description here

这是上面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) 的认值?

例如:

  1. 如果我在 50000添加 Total Premi,那么 Premi Pokok 的值仍然是 0 因为 Total Premi - Premi Pokok 是 {{ 1}} - 50000 = 0
  2. 如果我在 0添加 50000,在 Total Premi添加 40000,那么 Premi Pokok 的值是 Premi Pokok 因为 {{ 1}} - 10000Total Premi - Premi Pokok = 50000
  3. 并且 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);
    ...
  }
  ...