apskel-pos-flutter/lib/core/components/custom_date_picker.dart

97 lines
2.9 KiB
Dart
Raw Normal View History

2025-07-30 22:38:44 +07:00
import 'package:flutter/material.dart';
import 'package:enaklo_pos/core/assets/assets.gen.dart';
import 'package:enaklo_pos/core/constants/colors.dart';
import 'package:enaklo_pos/core/extensions/date_time_ext.dart';
class CustomDatePicker extends StatefulWidget {
final void Function(DateTime selectedDate)? onDateSelected;
final DateTime initialDate;
final Widget? prefix;
const CustomDatePicker({
super.key,
required this.initialDate,
this.onDateSelected,
this.prefix,
});
@override
State<CustomDatePicker> createState() => _CustomDatePickerState();
}
class _CustomDatePickerState extends State<CustomDatePicker> {
late DateTime selectedDate;
@override
void initState() {
selectedDate = widget.initialDate;
super.initState();
}
Future<void> _selectDate(BuildContext context) async {
final DateTime? picked = await showDatePicker(
context: context,
initialDate: selectedDate,
firstDate: DateTime(2000),
lastDate: DateTime(2101),
);
if (picked != null && picked != selectedDate) {
setState(() {
selectedDate = picked;
});
if (widget.onDateSelected != null) {
widget.onDateSelected!(picked);
}
}
}
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: 500,
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Flexible(
child: GestureDetector(
onTap: () => _selectDate(context),
child: AbsorbPointer(
child: TextFormField(
style: const TextStyle(
color: AppColors.black,
fontWeight: FontWeight.bold,
),
readOnly: true,
controller: TextEditingController(
text: selectedDate.toFormattedDate2(),
),
decoration: InputDecoration(
suffixIcon: Padding(
padding: const EdgeInsets.all(16.0),
child: Assets.icons.calendar.svg(),
),
prefix: widget.prefix,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(6.0),
borderSide: const BorderSide(color: AppColors.stroke),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(6.0),
borderSide: const BorderSide(color: AppColors.stroke),
),
),
),
),
),
),
],
),
),
],
);
}
}