Flutter Form 控制器抛出“方法 'validate' 在 null 上被调用”

问题描述

The method 'validate' was called on null.
Receiver: null
Tried calling: validate()

我不明白这个。我想问题可能是 Form 不是类的根元素,它不是 return Form(child: Column(children: [... 所以我尝试将 Form Widget 设为根,它停止了错误,但没有激活 TextFormField 验证器或保存,它只是说“一切正常,继续前进”。

这只是我目前希望验证的一个字段。我已经查找了其他这样的查询,Form 小部件和 TextFormField 都有键,所以我被卡住了。

我用 final _formKeyForDeposit = GlobalKey<FormState>();

声明表单键

这是不合作的形式:

Form(key: _formKeyForDeposit,child:
TextFormField(
    controller: _controllerDefaultDeposit,key: Key('defaultLoanDeposit'),decoration: Inputdecoration(
      //icon: Icon(Icons.location_city),labelText: 'Per item deposit',hintText: 'Whole numbers',suffixIcon: IconButton(
        icon: Icon(Icons.clear),onpressed: () {
          _controllerDefaultDeposit.clear();
        },),keyboardType: TextInputType.numberWithOptions(decimal: false,signed: false),onSaved: (String amountStr) {
      print("saving deposit");
      user.defaultItemDeposit = int.parse(amountStr.trim());
    },validator: (String value) {
      print(LOG + "validator called");
      if(int.tryParse(value.trim()) == null) {
        inputCompletionAlert += "But your default item deposit is not a number,please correct.\n";
        return 'Not a £-- whole number monetary amount';
    }
      if(value == "" || value == "0") {
        print(LOG + 'deposit validator called,should launch Dialog from here');
        inputCompletionAlert += "Would you like to set a default deposit?";
        return "Would you like to set a deposit?";
      }
      return null;
    },

解决方法

您是否尝试过构建自定义验证器函数,然后直接从验证器属性调用它。

例如:-验证器:验证

Validator (String value) { print(LOG + "validator called"); if(int.tryParse(value.trim()) == null) { inputCompletionAlert += "但是你的默认物品存款不是数字,请更正。\n"; return 'Not a £--整数货币金额'; }

,

这是一个不完整的问题,这个扩展框数组弄乱了验证器:

  ExpansionPanelList.radio(initialOpenPanelValue: 2,children: [
        bicyclePanel,carPanel,floodPanel,diyPanel,surplusPanel,gardeningPanel,ballSportsPanel,snowSportsPanel,waterSportsPanel,campingPanel,backpackingPanel,circusPanel,]),

我认为,当调用 _formKeyForDeposit.currentState.validate() 时,它会向下进入 ExpansionPanelList 并且无法逃脱以触发其上方的 TextFormFields 验证器。

由于我只有 1 个 TextFormField 超出 ExpansionPanelList 的宽度,所以我使用 _controllerDefaultDeposit.text 获取存款 FormField 值并手动验证它。这是一个笨拙的解决方案,但现在就可以了。