问题描述
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 值并手动验证它。这是一个笨拙的解决方案,但现在就可以了。