Flutter表单验证插件super_validation的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter表单验证插件super_validation的使用

使用

test_bloc.dart 文件中,你可以定义一个 SuperValidation 对象来处理字符串验证:

final SuperValidation validation = SuperValidation(validationFunc: (value) {
    if (value == null || value.isEmpty) {
      return '请输入一些文本';
    }
    return null;
});

对于整数或数字的验证,可以使用 SuperValidationIntSuperValidationNum 类:

final SuperValidationInt intValidation = SuperValidationInt.minMax(
  min: 0,
  max: 10,
  minMessage: '最小值为0',
  maxMessage: '最大值为10',
);

final SuperValidationNum numValidation = SuperValidationNum.minMax(
  min: 0,
  max: 10,
  minMessage: '最小值为0',
  maxMessage: '最大值为10',
);

对于枚举类型的验证,可以使用 SuperValidationEnum 类:

enum TestEnum { one, two, three }

final SuperValidationEnum<TestEnum> enumValidation = SuperValidationEnum()
    ..validation = '请选择一个选项';

// 在 `test_page.dart` 文件中使用
DropDownEnumField<TestEnum>(
  superValidation: context.read<TestBloc>().enumValidation,
  items: TestEnumM.mapName,
  autovalidateMode: AutovalidateMode.always,
),

test_page.dart 文件中,你可以使用 TextFieldSuperValidation 来添加带有验证功能的文本字段:

TextFieldSuperValidation(
    superValidation: context.read<TestBloc>().validation,
    autovalidateMode: AutovalidateMode.onUserInteraction,
);

如果你想要自定义错误装饰图标或后缀,可以使用 TextFieldSuperValidationWithIcon

TextFieldSuperValidationWithIcon(
      superValidation: superValidation,
      errorIcon: Icon(Icons.error, color: Colors.red, size: 20),
      errorSuffix: Icon(Icons.error, color: Colors.red, size: 20),
    );

你还可以强制设置验证文本:

validation.validate('验证文本');

设置文本字段的内容:

validation.text = event.text;

构建按钮时,可以使用 SuperValidationBuilder

SuperValidationBuilder(
  superValidation: context.read<TestBloc>().validation,
  builder: (context, validation, isValid) {
    return TextButton(
        onPressed: isValid
            ? () {
                print('测试');
              }
            : null,
        child: Text('测试'));
});

使用 SuperValidationSimpleMultyBuilder 可以实现多个验证条件的按钮:

SuperValidationSimpleMultyBuilder(
  builder: (context, isValid) {
      return ElevatedButton(
          onPressed: isValid
              ? () {
                  print('按下');
              }
              : null,
          child: Text('验证'),
      );
  },
  superValidation: [
      context.read<TestBloc>().numberValidation,
      context.read<TestBloc>().stringValidation,
  ],
)

使用 SuperValidationMultyBuilder 可以实现多个验证条件的按钮,并且可以自定义验证文本:

SuperValidationMultyBuilder(
  builder: (context, validation, isValid) {
      return Text(
                    validation.isEmpty ? '有效' : validation.toString(),
                    style: TextStyle(
                      color: isValid ? Colors.green : Colors.red,
                    ),
                  );
      },
  superValidation: {
      'string': context.read<TestBloc>().stringValidation,
      'number': context.read<TestBloc>().numberValidation,
  },
)

如果需要自定义逻辑,可以在 bloc 中使用 SuperValidationStream

final SuperValidationStream<String> superValidationStream =
    SuperValidationStream(
  superValidationMap: {
      'string': context.read<TestBloc>().stringValidation,
      'number': context.read<TestBloc>().numberValidation,
  },
);
superValidationStream.streamValidation.listen((event) {
    print('验证结果: $event');
});

自定义验证示例:

class SuperValidationFile extends SuperValidationA {
  SuperValidationFile() {
    validate();
  }

  void validate() {
    if (files.length != 2) {
      validation = '你需要添加两个文件';
    } else {
      validation = null;
    }
  }

  final StreamController<String?> _streamController = StreamController.broadcast();
  @override
  Stream<bool> get streamIsValid => _streamController.stream.map((event) => event == null);

  @override
  Stream<String?> get streamValidation => _streamController.stream;

  String? _validation;
  @override
  String? get validation => _validation;
  set validation(String? value) {
    _validation = value;
    _streamController.add(value);
  }

  List<FileManaged> _files = [];
  List<FileManaged> get files => [..._files];
  void addFile(FileManaged file) {
    _files.add(file);
    validate();
  }

  void removeFile(FileManaged file) {
    _files.remove(file);
    validate();
  }
}

使用 SuperValidationEnumBuilder 可以实现枚举类型的流构建器:

SuperValidationEnumBuilder<String>(
        superValidation: superValidation,
        builder: (context, value) {
          return ListView(
            physics: const NeverScrollableScrollPhysics(),
            shrinkWrap: true,
            children: values
                .map((e) => CheckboxListTile(
                      title: Text(e),
                      value: value == e,
                      onChanged: (value) {
                        if (value == true) {
                          superValidation.value = e;
                        }
                      },
                    ))
                .toList(),
          );
        });

使用 SuperValidationTextFieldListener 可以实现枚举类型到文本字段的转换:

SuperValidationTextFieldListener<String>(
                  transformer: (val) => val,
                  readOnly: true,
                  superValidation:
                      context.read<TestBloc>().stringEnumValidation),

更多关于Flutter表单验证插件super_validation的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter表单验证插件super_validation的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter应用中使用super_validation插件进行表单验证的示例代码。super_validation是一个强大的表单验证库,可以帮助你轻松地在Flutter中实现复杂的表单验证逻辑。

首先,确保你已经在pubspec.yaml文件中添加了super_validation依赖:

dependencies:
  flutter:
    sdk: flutter
  super_validation: ^最新版本号  # 请替换为当前最新版本号

然后,运行flutter pub get来安装依赖。

接下来,我们创建一个简单的Flutter应用,其中包含一个登录表单,并使用super_validation进行验证。

import 'package:flutter/material.dart';
import 'package:super_validation/super_validation.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: LoginScreen(),
    );
  }
}

class LoginScreen extends StatefulWidget {
  @override
  _LoginScreenState createState() => _LoginScreenState();
}

class _LoginScreenState extends State<LoginScreen> {
  final formKey = GlobalKey<FormState>();
  late ValidationController validationController;

  @override
  void initState() {
    super.initState();
    validationController = ValidationController(
      validators: {
        'email': MultiValidator([
          RequiredValidator(errorText: 'Email is required'),
          EmailValidator(errorText: 'Invalid email format'),
        ]),
        'password': MultiValidator([
          RequiredValidator(errorText: 'Password is required'),
          MinLengthValidator(6, errorText: 'Password must be at least 6 characters long'),
        ]),
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Login'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: formKey,
          child: Column(
            children: [
              TextFormField(
                decoration: InputDecoration(labelText: 'Email'),
                validator: (value) {
                  validationController.validateField('email', value);
                  return validationController.getErrorText('email');
                },
                onChanged: (value) {
                  validationController.updateField('email', value);
                },
              ),
              SizedBox(height: 16),
              TextFormField(
                decoration: InputDecoration(labelText: 'Password'),
                obscureText: true,
                validator: (value) {
                  validationController.validateField('password', value);
                  return validationController.getErrorText('password');
                },
                onChanged: (value) {
                  validationController.updateField('password', value);
                },
              ),
              SizedBox(height: 24),
              ElevatedButton(
                onPressed: () {
                  if (formKey.currentState!.validate()) {
                    // If form is valid, you can perform your login action here
                    print('Form is valid, proceed with login');
                  }
                },
                child: Text('Login'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    validationController.dispose();
    super.dispose();
  }
}

在这个示例中,我们做了以下几件事:

  1. 创建一个ValidationController实例,并定义了两个字段(emailpassword)的验证规则。
  2. TextFormFieldvalidator回调中,调用validationController.validateField方法进行验证,并返回相应的错误信息。
  3. TextFormFieldonChanged回调中,调用validationController.updateField方法更新字段值,这样验证状态会实时更新。
  4. 在表单提交按钮的onPressed回调中,调用formKey.currentState!.validate()来验证整个表单。如果表单验证通过,你可以执行相应的登录操作。

注意,super_validation插件提供了丰富的验证器,如RequiredValidatorEmailValidatorMinLengthValidator等,你可以根据需求自由组合这些验证器。

回到顶部