从另一个 class 验证 TextFormField

Validate TextFormField from another class

我有 2 个全状态 class,第一个 class 包含 TextFormField 和用于验证 TextFormField 的按钮。第二个 class 包含 TextFormField。

如何在点击按钮时验证第一个 class 调用的第二个 TextFormField?

class FormValidation extends StatefulWidget {
  const FormValidation({Key key}) : super(key: key);

  @override
  _FormValidationState createState() => _FormValidationState();
}

class _FormValidationState extends State<FormValidation> {
  final _formKey = GlobalKey<FormState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: Form(
          key: _formKey,
          child: Column(
            children: [
              TextFormField(
                validator: (value) =>
                    value.isEmpty ? 'Field 1 cannot be Empty' : null,
              ),
              SecondForm(),
              ElevatedButton(
                  onPressed: () {
                    if (_formKey.currentState.validate()) {
                      print('DataSubmitted');
                    }
                  },
                  child: Text('Submit'))
            ],
          ),
        ),
      ),
    );
  }
}

和第二种形式

class SecondForm extends StatefulWidget {
  const SecondForm({Key key}) : super(key: key);

  @override
  _SecondFormState createState() => _SecondFormState();
}

class _SecondFormState extends State<SecondForm> {
  final _formKey = GlobalKey<FormState>();

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: TextFormField(
          validator: (value) =>
              value.isEmpty ? 'Field 2 cannot be Empty' : null),
    );
  }
}

您可以通过将 TextEditingController 对象传递给第二个 class 并将该对象分配给第二个 class 的 TextFormField 来解决此问题,现在当您单击第一个 class,您拥有 TextEditingController 对象,因此您可以检查该对象数据并对其应用逻辑。

在 secondForm 上添加这个 class,用函数 widget 更新验证器

final Function(String)? validators; //initialization 

validator: widget.validators as String? Function(String?)?,

在 FormValidation 中 class 调用这个函数,像这样

SecondForm(
validators: (String? value) {
           if (value!.isEmpty)
                return 'Required field';
                             }
)