【问题标题】:Flutter TextFormField Validation using constructor to call in one page errorFlutter TextFormField Validation使用构造函数调用一页错误
【发布时间】:2019-08-23 04:36:45
【问题描述】:

我有 3 个构造函数类

Textformfield.dart
Validator.dart
Signin.dart

这里是 textformfield.dart

class CustomTextField extends StatelessWidget {
  final String hint;
  final TextEditingController textEditingController;
  final TextInputType keyboardType;
  final bool obscureText;
  final IconData icon;
  final Validator validator;
  double _width;
  double _pixelRatio;
  bool large;
  bool medium;

  CustomTextField({
    this.hint,
    this.textEditingController,
    this.keyboardType,
    this.icon,
    this.obscureText = false,
    this.validator,
  });

  @override
  Widget build(BuildContext context) {
    _width = MediaQuery.of(context).size.width;
    _pixelRatio = MediaQuery.of(context).devicePixelRatio;
    large = ResponsiveWidget.isScreenLarge(_width, _pixelRatio);
    medium = ResponsiveWidget.isScreenMedium(_width, _pixelRatio);
    return Material(
      borderRadius: BorderRadius.circular(30.0),
      elevation: large ? 12 : (medium ? 10 : 8),
      child: TextFormField(
        autovalidate: true,
        controller: textEditingController,
        keyboardType: keyboardType,
        cursorColor: Colors.orange[200],
        decoration: InputDecoration(
          prefixIcon: Icon(icon, color: Colors.orange[200], size: 20),
          hintText: hint,
          border: OutlineInputBorder(
              borderRadius: BorderRadius.circular(30.0),
              borderSide: BorderSide.none),
        ),
      ),
    );
  }
}

她是我的验证器.dart 代码

class Validator {
  String validateName(String value) {
    String pattern = r'(^[a-zA-Z ]*$)';
    RegExp regExp = new RegExp(pattern);
    if (value.length == 0) {
      return "Name is Required";
    } else if (!regExp.hasMatch(value)) {
      return "Name must be a-z and A-Z";
    }
    return null;
  }

  String validateMobile(String value) {
    String pattern = r'(^[0-9]*$)';
    RegExp regExp = new RegExp(pattern);
    if (value.length == 0) {
      return "Mobile is Required";
    } else if (value.length != 10) {
      return "Mobile number must 10 digits";
    } else if (!regExp.hasMatch(value)) {
      return "Mobile Number must be digits";
    }
    return null;
  }

  String validatePasswordLength(String value){
    if(value.length==0){
      return "Password can't be empty";
    } else if (value.length < 10){
      return "Password must be longer than 10 characters";
    }
    return null;
  }

  String validateEmail(String value) {
    String pattern =
        r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$';
    RegExp regExp = new RegExp(pattern);
    if (value.length == 0) {
      return "Email is Required";
    } else if (!regExp.hasMatch(value)) {
      return "Invalid Email";
    } else {
      return null;
    }
  }
}

这是我遇到错误的一些 signin.dart 代码。

Widget form() {
    return Container(
      margin: EdgeInsets.only(
          left: _width / 12.0, right: _width / 12.0, top: _height / 15.0),
      child: Form(
        key: _key,
        autovalidate: _validate,
        child: Column(
          children: <Widget>[
            emailTextFormField(),
            SizedBox(height: _height / 40.0),
            passwordTextFormField(),
          ],
        ),
      ),
    );
  }
   Widget emailTextFormField() {
    return CustomTextField(
      keyboardType: TextInputType.emailAddress,
      textEditingController: emailController,
      icon: Icons.email,
      hint: "Email ID",    
      validator: Validator().validateEmail,
    );
  }

  Widget passwordTextFormField() {
    return CustomTextField(
      keyboardType: TextInputType.emailAddress,
      textEditingController: passwordController,
      icon: Icons.lock,
      obscureText: true,
      hint: "Password",
    );
  }  

我尝试调用 Validator().validateEmail, 来验证我在 emailTextFormField 中使用的文本 “validator: Validator().validateEmail,

它总是显示错误: 参数类型“字符串”不能分配给参数类型Validator 有没有建议使用我的Validator 类调用validator 来验证emailTextFormField

【问题讨论】:

    标签: class validation flutter dart constructor


    【解决方案1】:

    CustomTextField

    中更改此行
    class CustomTextField extends StatelessWidget {
    
    //final Validator validator;//remove this line
    final FormFieldValidator<String> validator; // add this line
    

    【讨论】:

    • 添加该行后,我再次尝试使用validator:Validator().validateEmail(value), 添加validateEmail(value) 时显示错误错误:无法将参数类型“字符串”分配给参数类型“字符串函数” (字符串)我认为错误来自String validateEmail(String value),但在很多教程中,如果他们直接输入代码/不使用构造函数(类),我永远不会看到这样的错误
    • validator:Validator().validateEmail(value) 在此删除值并更改为 validator:Validator().validateEmail
    • 或者你必须像这样使用validator:(value) =&gt; Validator().validateEmail(value)
    • 谢谢你,我已经尝试过了,现在它没有显示错误,但它没有显示我在验证器中制作的错误消息,
    【解决方案2】:

    现在已经一年多了,所以你可能不再需要任何帮助了。 无论如何:我只是偶然发现了这篇文章,遇到了类似的问题。

    解决方案:

    • TextFormField 中的“validator”属性要求输入字符串函数的名称 -> 因此您不必使用 () 来告诉它它是一个函数
    • 如果您删除验证器类包装并保留函数,它将正常工作:

    类似这样的:

    验证.dart:

    String validateName(String value) {
        String pattern = r'(^[a-zA-Z ]*$)';
        RegExp regExp = new RegExp(pattern);
        if (value.length == 0) {
          return "Name is Required";
        } else if (!regExp.hasMatch(value)) {
          return "Name must be a-z and A-Z";
        }
        return null;
      }
    

    main.dart:

    import 'validate.dart';
    
    (...)
        
    return CustomTextField(
          validator: validateName,
        (...)
        );
    

    希望对某人有所帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-05
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多