rup-project/app/lib/widgets/pet_registration/input_formatters.dart

79 lines
2.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
// 범위 제한 Formatter (월: 1~12)
class DateRangeInputFormatter extends TextInputFormatter {
final int min;
final int max;
DateRangeInputFormatter({required this.min, required this.max});
@override
TextEditingValue formatEditUpdate(
TextEditingValue oldValue,
TextEditingValue newValue,
) {
if (newValue.text.isEmpty) {
return newValue;
}
final int? value = int.tryParse(newValue.text);
if (value == null) {
return oldValue; // 숫자가 아닌 경우 이전 값 유지
}
if (value < min || value > max) {
// 범위를 벗어나면 이전 값 유지 (단, 입력 중인 상태 고려 - 예: 3을 입력하려는데 30이 되면 안됨)
// 여기서는 단순하게 max보다 크면 입력 불가 처리 (사용자 경험상 이게 나을 수 있음)
if (newValue.text.length > max.toString().length) {
return oldValue;
}
// 더 정교한 로직이 필요할 수 있으나, 기본적으로 입력 막음
if (value > max) return oldValue;
}
return newValue;
}
}
// 일(Day) 입력 Formatter (월에 따라 28~31일 제한)
class DayInputFormatter extends TextInputFormatter {
final TextEditingController yearController;
final TextEditingController monthController;
DayInputFormatter({
required this.yearController,
required this.monthController,
});
@override
TextEditingValue formatEditUpdate(
TextEditingValue oldValue,
TextEditingValue newValue,
) {
if (newValue.text.isEmpty) {
return newValue;
}
final int? day = int.tryParse(newValue.text);
if (day == null) {
return oldValue;
}
int year = int.tryParse(yearController.text) ?? DateTime.now().year;
int month = int.tryParse(monthController.text) ?? 1;
int maxDay = DateTime(year, month + 1, 0).day; // 해당 월의 마지막 날짜 계산
if (day < 1 || day > maxDay) {
if (newValue.text.length > maxDay.toString().length) {
return oldValue;
}
if (day > maxDay) return oldValue;
}
return newValue;
}
}