• Form & TextFormField(每日Flutter 小部件)


    表单 Form

    引入 validation_extensions 1.0.1  三方库

    使用到了Flutter 中的扩展函数

    import 'package:flutter/material.dart';
    import 'package:validation_extensions/validation_extensions.dart';
    
    class FormContainerWidget extends StatefulWidget {
      FormContainerWidget({Key key}) : super(key: key);
    
      _FormContainerWidgetState createState() => _FormContainerWidgetState();
    }
    
    class _FormContainerWidgetState extends State<FormContainerWidget> {
      final _formKey = GlobalKey<FormState>();
    
      String password;
    
      String usernameValidation(String v) => v.isRequired()();
    
      String emailValidation(String v) => [v.isRequired(), v.isEmail()].validate();
    
      String ageValidation(String v) =>
          v.min(18, errorText: "You must be older than 18")();
    
      String passwordValidation(String v) => [
            v.isRequired(),
            v.minLength(8),
          ].validate();
    
      String confirmPasswordValidation(String v) => [
            v.isRequired(),
            v.minLength(8),
            v.match(password),
          ].validate();
    
      validate() {
        _formKey.currentState.validate();
      }
    
      resetForm() {
        _formKey.currentState.reset();
      }
    
      @override
      Widget build(BuildContext context) {
        return Expanded(
          child: SingleChildScrollView(
            child: Padding(
              padding: const EdgeInsets.all(24.0),
              child: Form(
                key: _formKey,
                child: Column(
                  children: <Widget>[
                    TextFormField(
                      validator: usernameValidation,
                      decoration: InputDecoration(
                        labelText: "Username*",
                      ),
                    ),
                    TextFormField(
                      validator: emailValidation,
                      decoration: InputDecoration(
                        labelText: "Email address*",
                      ),
                    ),
                    TextFormField(
                      validator: ageValidation,
                      decoration: InputDecoration(
                          labelText: "Age", hintText: "Optional age"),
                    ),
                    TextFormField(
                      validator: passwordValidation,
                      obscureText: true,
                      onChanged: (v) => password = v,
                      decoration: InputDecoration(
                        labelText: "Password*",
                      ),
                    ),
                    TextFormField(
                      validator: confirmPasswordValidation,
                      obscureText: true,
                      decoration: InputDecoration(
                        labelText: "Confirm password*",
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.all(24.0),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                        children: <Widget>[
                          RaisedButton(
                            color: Colors.lightBlue,
                            onPressed: validate,
                            child: Text("Validate"),
                          ),
                          RaisedButton(
                            color: Colors.redAccent,
                            onPressed: resetForm,
                            child: Text("Reset form"),
                          ),
                        ],
                      ),
                    ),
                  ],
                ),
              ),
            ),
          ),
        );
      }
    }

     扩展函数如下:

    library validationextensions;
    
    var emailRegExp =
        r"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?";
    
    extension MultiValidations on List<Function> {
      String validate() {
        String errorText;
        for (int i = 0; i < this.length; i++) {
          errorText = this[i]();
          if (errorText != null) {
            break;
          }
        }
        return errorText;
      }
    }
    
    extension Validations on String {
      Function isRequired({String errorText}) =>
          () => this.isEmpty || this == null ? errorText ?? "This Field is required" : null;
    
      Function isEmail({String errorText}) => () => this == ""
          ? null
          : !RegExp(emailRegExp).hasMatch(this)
              ? errorText ?? "invalid Email address"
              : null;
    
      Function minLength(int min, {String errorText}) => () => this == ""
          ? null
          : this.length < min
              ? errorText ?? "minimum length is $min characters"
              : null;
    
      Function maxLength(int max, {String errorText}) => () => this == ""
          ? null
          : this.length > max
              ? errorText ?? "maximum length is $max characters"
              : null;
    
      Function lengthRange(int min, int max, {String errorText}) => () => this == ""
          ? null
          : this.length < min || this.length > max
              ? errorText ?? "length must be between $min & $max characters"
              : null;
    
      Function match(String stringToMatch, {String errorText}) => () => this == ""
          ? null
          : !RegExp("^$stringToMatch$", caseSensitive: true).hasMatch(this)
              ? errorText ?? "Values doesn't match"
              : null;
    
      Function matchPattern(String regExp, {String errorText}) => () => this == ""
          ? null
          : !RegExp("$regExp").hasMatch(this)
              ? errorText ?? "Pattern doesn't match"
              : null;
    
      Function isInt({String errorText}) => () => this == ""
          ? null
          : int.tryParse(this) == null ? errorText ?? "invalid integer" : null;
    
      Function isDouble({String errorText}) => () => this == ""
          ? null
          : double.tryParse(this) == null ? errorText ?? "invalid double" : null;
    
      Function min(int min, {String errorText}) => () => this == ""
          ? null
          : double.tryParse(this) == null || double.parse(this) < min
              ? errorText ?? "Number must be bigger than $min"
              : null;
    
      Function max(int max, {String errorText}) => () => this == ""
          ? null
          : double.tryParse(this) == null || double.parse(this) > max
              ? errorText ?? "Number must be smaller than $max"
              : null;
    
      Function range(int min, int max, {String errorText}) => () => this == ""
          ? null
          : double.tryParse(this) == null &&
                  double.parse(this) < min &&
                  double.parse(this) > max
              ? errorText ?? "Number must be between $min & $max"
              : null;
    }
    

      

  • 相关阅读:
    ZZNU 1995: cots' times
    网站后缀名都有哪些
    webstorm运行到服务器(Apache)
    window系统下node.js环境配置
    window系统安装node.js
    网站创建自定义百度地图
    响应式一级到三级导航
    H5插入视频兼容各大浏览器
    phpStudy环境安装
    jquery on和bind
  • 原文地址:https://www.cnblogs.com/wjw334/p/12843360.html
Copyright © 2020-2023  润新知