패키지, 저장소 및 앱 카테고리 검색

GitHub 저장소themisir/form-validator

폼 검증기

Flutter 폼 위젯을 위한 가장 간단한 양식 검증

폼 검증기 프로젝트 이미지
스타
80
포크
42
최근 푸시(UTC)
2025. 11. 4.
프로젝트 상태
활성

원본 README

아래는 영문 원문 스냅샷입니다. 최신 내용은 GitHub에서 확인하세요.

form_validator

pub package GitHub GitHub Workflow Status codecov

Simplest form validation for flutter form widgets.

  • Zero dependency
  • Localization supported
  • Extensible
  • Well tested
  • Open source

Example

TextFormField(
  validator: ValidationBuilder().email().maxLength(50).build(),
  decoration: InputDecoration(labelText: 'Email'),
),

live demo

Getting Started

Installation

Add form_validator as dependency to your flutter project by adding this lines to pubspec.yaml.

dependencies:
  form_validator: ">=0.1.1 <2.0.0"

Then run flutter pub get to install required dependencies.

Check installation tab for more information

Code

Import form_validator package to your dart widgets by writing:

import 'package:form_validator/form_validator.dart';

Now you can use ValidationBuilder class to create validation logic. Here's simple validator that validates if input length is between 10 and 50 characters long.

final validate = ValidationBuilder().minLength(10).maxLength(50).build();

print(validate('test'));        // Minimum length must be at least 10 characters
print(validate('Hello World')); // null, means value is correct

Localization

You can set global locale using ValidationBuilder.setLocale(String localeName) or you can also define locale on ValidationBuilder({ String localeName }) constructor.

ValidationBuilder.setLocale('en');

// will use *en* localization
ValidationBuilder()
  .minLength(5)
  .build();

// will use *az* localization
ValidationBuilder(localeName: 'az')
  .minLength(5)
  .build();

// will display custom message
ValidationBuilder()
  .minLength(5, 'Length < 5 😟')
  .build();

Methods

.minLength(int minLength, [String message])

Validates if value length is not less than minLength.

.maxLength(int maxLength, [String message])

Validates if value length is not more than maxLength.

.email([String message])

Checks if value is an email address.

.phone([String message])

Checks if value is an phone number.

Note: This method might be changed in future.

.ip([String message])

Checks if value is correct IPv4 address.

.ipv6([String message])

Checks if value is correct IPv6 address.

.url([String message])

Checks if value is correct url address.

.match(String otherValue, [String message])

Checks if the value matches the specified otherValue. This can be used to validate if two input values are identical.

.regExp(RegExp regExp, String message)

Validates if value does matches regExp or not.

message argument is required in this method.

.or(Action<ValidationBuilder> left, Action<ValidationBuilder> right, {bool reverse = false})

Validates if value passes any of left and right validations. If value doesn't passes any error message from right validation will be displayed (If reverse set to true message from left validation will be displayed).

Example:

print(
  ValidationBuilder().or(
    (builder) => builder.email('not email'),
    (builder) => builder.phone('not phone'),
  )
  .test('invalid')
); // not phone

print(
  ValidationBuilder().or(
    (builder) => builder.email('not email'),
    (builder) => builder.phone('not phone'),
    reverse: true,
  )
  .test('invalid')
); // not email

Notes

ValidationBuilder is mutable.

You need to construct different instances for each validation.

Wrong
final builder = ValidationBuilder().email();

TextFormField(
  validator: builder.maxLength(50).build(),
),
TextFormField(
  validator: builder.maxLength(20).build(),
),
Correct
final validator1 = ValidationBuilder().email().maxLength(50).build();
final validator2 = ValidationBuilder().email().maxLength(20).build();

TextFormField(
  validator: validator1,
),
TextFormField(
  validator: validator2,
),
Add custom localization

Firstly you need to extend abstract FormValidatorLocale class.

import 'package:form_validator/form_validator.dart';

class MyValidationLocale extends FormValidatorLocale {
  @override
  String name() => "custom";

  @override
  String required() => "Field is required";

  ...
}

PROTIP: You can copy a language file from /lib/src/i18n folder and modify messages as you want.

Then you can use your custom locale class as global or local validation locale.

// global locale
void main() {
  ValidationBuilder.globalLocale = MyValidationLocale();
  ...
}

// local locale
final locale = MyValidationLocale();

build(BuildContext context) {
  final emailValidator = ValidationBuilder(locale: locale)
    .email()
    .build();
  ...
}

PROTIP: Feel free to add your locale to library by opening pull request TheMisir/form-validator to support library.

Extending ValidationBuilder

You can use dart extension methods to extend ValidationBuilder.

extension CustomValidationBuilder on ValidationBuilder {
  password() => add((value) {
    if (value == 'password') {
      return 'Password should not "password"';
    }
    return null;
  });
}

final validator = ValidationBuilder().password().build();

Support

If you would like to support this library you could translate messages to your own language.

Misir GitHub avatar
GitHub 작성자

Misir ↗

I can read regexs

언어DartHTMLSwiftKotlinObjective-C

분류

이 저장소가 배포한 패키지

사용 중인 의존성

의존성 목록 1 개

  • test개발 의존성^1.16.8

프로젝트에 맞는 저장소를 선택하려면?

사용 목적에 따라 검색하고 개발 활동을 비교한 뒤 원본 저장소에서 요구 사항을 확인하세요.

  1. 이름, 작성자 또는 설명으로 검색하고 기술 주제로 범위를 좁힙니다.
  2. 스타, 포크, 최근 푸시를 함께 비교하세요. 스타는 관심의 지표이며 품질을 보장하지 않습니다.
  3. 사용하기 전에 GitHub에서 README, 라이선스, Issues를 확인하세요.

출처 및 관리

“A repository is the most basic element of GitHub.”

GitHub Docs — About repositories ↗