Flutter Forms:获取错误字段列表

vzu*_*urd 5 flutter flutter-form-builder

我们能否在验证后从 Flutter 表单中获取错误字段列表?这将帮助开发人员使用焦点节点将注意力重定向到错误的字段。

Gui*_*oux 5

我认为不可能从对象FormFormState.

但这里有一种方法可以获得您想要的结果(重点关注错误的字段):

class _MyWidgetState extends State<MyWidget> {
  FocusNode _fieldToFocus;
  List<FocusNode> _focusNodes;

  final _formKey = GlobalKey<FormState>();
  final _numberOfFields = 3;

  String _emptyFieldValidator(String val, FocusNode focusNode) {
    if (val.isEmpty) {
      _fieldToFocus ??= focusNode;
      return 'This field cannot be empty';
    }
    return null;
  }

  @override
  void initState() {
    super.initState();
    _focusNodes =
        List<FocusNode>.generate(_numberOfFields, (index) => FocusNode());
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(actions: [
        IconButton(
          icon: Icon(Icons.check),
          onPressed: () {
            if (_formKey.currentState.validate()) {
              print('Valid form');
            } else {
              _fieldToFocus?.requestFocus();
              _fieldToFocus = null;
            }
          },
        ),
      ]),
      body: Form(
        key: _formKey,
        child: Column(children: [
          ...List<TextFormField>.generate(
            _numberOfFields,
            (index) => TextFormField(
              decoration: InputDecoration(hintText: "Field $index"),
              focusNode: _focusNodes[index],
              validator: (val) => _emptyFieldValidator(val, _focusNodes[index]),
            ),
          ),
        ]),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

您只需FocusNode为每个字段创建一个,这样您就可以调用requestFocus精确的字段(在您的情况下,该字段被视为无效)。然后在validator表单字段的属性中,因为它是 调用的方法FormState.validate(),所以您需要设置一个临时变量,其中将包含正确的FocusNode. 在我的示例中,我仅_fieldToFocus在尚未使用??=运算符分配变量时才设置该变量。在请求将焦点放在我设置的节点_fieldToFocus上之后null,它仍然可以用于另一次验证。

您可以尝试我在DartPad上使用的完整测试代码。

抱歉,如果我从你的问题中得出了一些结论,但我仍然希望这会对你有所帮助。