76 lines
1.7 KiB
Dart
76 lines
1.7 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) {
|
|
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;
|
|
}
|
|
}
|