Как вызвать конкретный валидатор c вместо вызова всех валидаторов одновременно с помощью `form.validate ()`? - PullRequest
0 голосов
/ 03 марта 2020

Это код:

if (form.validate()) {
          // Text forms was validated.
          if (mounted) {
            setState(() {
              _isButtonEnabled = true;
            });
          }
          form.save();
        }

Я хочу вызвать спецификатор c для определения c TextFormField

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Ответ Жуана верен, но он также чрезмерно сложен. Вместо этого вы можете объявить GlobalKey для каждого поля, которое вы хотите проверить независимо:

GlobalKey<FormFieldState> fieldKey = GlobalKey();

Присвойте его TextFormField, которое вы хотите проверить:

TextFormField(
    key: fieldKey,
    ...

И затем используйте ключ для проверки этого поля:

bool valid = fieldKey.currentState.validate();
0 голосов
/ 03 марта 2020

Вам нужно будет обернуть каждое поле, которое вы хотите проверить, индивидуально Form Виджетом и его собственным ключом:

class TextFormFieldValidation extends StatefulWidget {
  @override
  _TextFormFieldValidationState createState() => _TextFormFieldValidationState();
}

class _TextFormFieldValidationState extends State<TextFormFieldValidation> {
  List<GlobalKey<FormState>> _formKeysList= [
    GlobalKey<FormState>(),
    GlobalKey<FormState>(),
  ];

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Form(
          key: _formKeysList[0],
          child: TextFormField(
            validator: (value) => 'Bad',
          ),
        ),
        Form(
          key: _formKeysList[1],
          child: TextFormField(
            validator: (value) => 'Bad',
          ),
        ),
        RaisedButton(
          child: Text('Validate 1'),
          onPressed: () => _formKeysList[0].currentState.validate(),
        ),
        RaisedButton(
          child: Text('Validate 2'),
          onPressed: () => _formKeysList[1].currentState.validate(),
        ),
        RaisedButton(
          child: Text('Reset'),
          onPressed: () => _formKeysList.forEach((key) => key.currentState.reset()),
        ),
      ],
    );
  }
}
...