1
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;
    },
  ),
),
4

2 回答 2

1

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

例如 :-

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'; 
  } 
}
于 2021-03-24T07:55:45.793 回答
0

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

  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获取 Deposit FormField 值并手动验证它。这是一个 hacky 解决方案,但现在可以。

于 2021-03-25T11:56:10.583 回答