Vintage appMaker의 Tech Blog

[Dart] 입력값 Validate를 위한 예제 본문

Source code or Tip/Flutter & Dart

[Dart] 입력값 Validate를 위한 예제

VintageappMaker 2024. 4. 20. 11:40

앱을 만들다보면 "개인정보 입력" 또는 "다양한 신청화면"을 구현해야 할 때가 있다. 이럴 경우, 입력된 값들이 유효한지 채크해야 하는 것이 필수인데 화면이 복잡할 수록 검증코드가 지저분해지게 된다. 이 때, Validate 관련 모듈을 만들면 유용하게 사용할 수 있다.  다음은 예제이다. 

 

class ValidatorDSL {
  List<Function> errors = [];

  ValidatorDSL isNotEmpty(String value, Function errorMessage) {
    if (value.isEmpty) {
      errors.add(errorMessage);
    }
    return this;
  }

  ValidatorDSL isEmail(String value, Function errorMessage) {
    if (value.isEmpty) return this;
    final emailRegex = RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$');
    if (!emailRegex.hasMatch(value)) {
      errors.add(errorMessage);
    }
    return this;
  }

  ValidatorDSL isMinLength(String value, int minLength, Function errorMessage) {
    if (value.length < minLength) {
      errors.add(errorMessage);
    }
    return this;
  }

  ValidatorDSL isMaxLength(String value, int maxLength, Function errorMessage) {
    if (value.length > maxLength) {
      errors.add(errorMessage);
    }
    return this;
  }

  void validate({Function? onError, Function? onSuccess}) {
    if (errors.isEmpty == false) {
      errors.forEach((fnErr) {
        fnErr();
      });
      if (onError != null) onError();
    } else {
      if (onSuccess != null) onSuccess();
    }
  }
}

// 사용 예제
void testValidate() {
  // test값
  final email1 = '';
  final passwd1 = '12345';

  final email2 = 'google@adsloader.co.kr';
  final passwd2 = '123456890123dfsdfds';

  ValidatorDSL()
    // email1, passwd1 검증
    ..isNotEmpty(email1, () {
      print("email1이 비었습니다.");
    })
    ..isNotEmpty(passwd1, () {
      print("passwd1 비밀번호가 비었습니다.");
    })
    ..isEmail(email1, () {
      print("email1이 유효하지 않습니다.");
    })
    ..isMinLength(passwd1, 6, () {
      print("passwd1 비번의 글자수가 적습니다.");
    })
    ..isMaxLength(passwd1, 12, () {
      print("passwd1 글자수가 많습니다.");
    })

    // email2, passwd2 검증
    ..isNotEmpty(email2, () {
      print("emaili2 비었습니다.");
    })
    ..isNotEmpty(passwd2, () {
      print("passwd2 비밀번호가 비었습니다.");
    })
    ..isEmail(email2, () {
      print("email2이 유효하지 않습니다.");
    })
    ..isMinLength(passwd2, 6, () {
      print("passwd2 비번의 글자수가 적습니다.");
    })
    ..isMaxLength(passwd2, 12, () {
      print("passwd2의 글자수가 많습니다.");
    })
    ..validate(onError: () {
      print("😣 정보의 유효성에 문제가 있습니다.");
    }, onSuccess: () {
      print("😀 입력된 정보의 유효성에 문제가 없습니다. ");
    });
}

 

결과화면은 다음과 같다. 

email1이 비었습니다.
passwd1 비번의 글자수가 적습니다.
passwd2의 글자수가 많습니다.
😣 정보의 유효성에 문제가 있습니다.
Comments