253 lines
9.5 KiB
Dart
253 lines
9.5 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:google_fonts/google_fonts.dart';
|
|
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
|
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
|
|
|
// ignore: must_be_immutable
|
|
class CustomDatePickerUtil extends StatefulWidget {
|
|
TextEditingController? controller;
|
|
final FocusNode? focusNode;
|
|
final String hintText;
|
|
final String dateFormat;
|
|
final String locale;
|
|
final DateTime? initialDate;
|
|
final DateTime firstDate;
|
|
final DateTime? lastDate;
|
|
final bool timePicker;
|
|
final FormFieldValidator<String>? validator;
|
|
|
|
CustomDatePickerUtil({
|
|
super.key,
|
|
this.controller,
|
|
this.focusNode,
|
|
required this.hintText,
|
|
required this.dateFormat,
|
|
required this.locale,
|
|
required this.timePicker,
|
|
this.initialDate,
|
|
required this.firstDate,
|
|
this.lastDate,
|
|
this.validator,
|
|
});
|
|
|
|
@override
|
|
_CustomDatePickerState createState() => _CustomDatePickerState();
|
|
}
|
|
|
|
class _CustomDatePickerState extends State<CustomDatePickerUtil> {
|
|
DateTime? _selectedDate;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_selectedDate = widget.initialDate;
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
super.dispose();
|
|
}
|
|
|
|
_selectDate(BuildContext context) async {
|
|
final pickedDate = await showDatePicker(
|
|
context: context,
|
|
initialDate: getCurrentTimestamp,
|
|
firstDate: widget.firstDate,
|
|
lastDate: widget.lastDate ?? DateTime(2100),
|
|
builder: (context, child) {
|
|
return wrapInMaterialDatePickerTheme(
|
|
context,
|
|
child!,
|
|
headerBackgroundColor: FlutterFlowTheme.of(context).primary,
|
|
headerForegroundColor: FlutterFlowTheme.of(context).info,
|
|
headerTextStyle: FlutterFlowTheme.of(context).headlineLarge.override(
|
|
fontFamily: FlutterFlowTheme.of(context).headlineLargeFamily,
|
|
fontSize: 32.0,
|
|
letterSpacing: 0.0,
|
|
fontWeight: FontWeight.w600,
|
|
useGoogleFonts: GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).headlineLargeFamily),
|
|
),
|
|
pickerBackgroundColor: FlutterFlowTheme.of(context).primaryBackground,
|
|
pickerForegroundColor: FlutterFlowTheme.of(context).primaryText,
|
|
selectedDateTimeBackgroundColor: FlutterFlowTheme.of(context).primary,
|
|
selectedDateTimeForegroundColor: FlutterFlowTheme.of(context).info,
|
|
actionButtonForegroundColor: FlutterFlowTheme.of(context).primaryText,
|
|
iconSize: 24.0,
|
|
);
|
|
},
|
|
);
|
|
|
|
if (pickedDate != null) {
|
|
if (widget.timePicker == true) {
|
|
final TimeOfDay? pickedTime = await showTimePicker(
|
|
context: context,
|
|
initialTime: TimeOfDay.fromDateTime(_selectedDate ?? DateTime.now()),
|
|
builder: (context, child) {
|
|
return wrapInMaterialTimePickerTheme(
|
|
context,
|
|
child!,
|
|
headerBackgroundColor: FlutterFlowTheme.of(context).primary,
|
|
headerForegroundColor: FlutterFlowTheme.of(context).info,
|
|
headerTextStyle: FlutterFlowTheme.of(context).headlineLarge.override(
|
|
fontFamily: FlutterFlowTheme.of(context).headlineLargeFamily,
|
|
fontSize: 32.0,
|
|
letterSpacing: 0.0,
|
|
fontWeight: FontWeight.w600,
|
|
useGoogleFonts: GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).headlineLargeFamily),
|
|
),
|
|
pickerBackgroundColor: FlutterFlowTheme.of(context).primaryBackground,
|
|
pickerForegroundColor: FlutterFlowTheme.of(context).info,
|
|
selectedDateTimeBackgroundColor: FlutterFlowTheme.of(context).primary,
|
|
selectedDateTimeForegroundColor: FlutterFlowTheme.of(context).info,
|
|
pickerDialForegroundColor: FlutterFlowTheme.of(context).primaryText,
|
|
actionButtonForegroundColor: FlutterFlowTheme.of(context).primaryText,
|
|
iconSize: 24.0,
|
|
);
|
|
},
|
|
);
|
|
|
|
if (pickedTime != null) {
|
|
setState(() {
|
|
_selectedDate = DateTime(
|
|
pickedDate.year,
|
|
pickedDate.month,
|
|
pickedDate.day,
|
|
pickedTime.hour,
|
|
pickedTime.minute,
|
|
);
|
|
widget.controller?.text = dateTimeFormat(
|
|
widget.dateFormat,
|
|
_selectedDate,
|
|
locale: widget.locale,
|
|
);
|
|
widget.controller?.selection = TextSelection.collapsed(
|
|
offset: widget.controller!.text.length,
|
|
);
|
|
});
|
|
}
|
|
} else {
|
|
setState(() {
|
|
_selectedDate = DateTime(
|
|
pickedDate.year,
|
|
pickedDate.month,
|
|
pickedDate.day,
|
|
);
|
|
widget.controller = TextEditingController(
|
|
text: dateTimeFormat(
|
|
widget.dateFormat,
|
|
_selectedDate,
|
|
locale: widget.locale,
|
|
));
|
|
widget.controller?.selection = TextSelection.collapsed(
|
|
offset: widget.controller!.text.length,
|
|
);
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Row(
|
|
mainAxisSize: MainAxisSize.max,
|
|
children: [
|
|
SizedBox(
|
|
width: MediaQuery.of(context).size.width,
|
|
height: 60.0,
|
|
child: Stack(
|
|
children: [
|
|
Padding(
|
|
padding: const EdgeInsetsDirectional.fromSTEB(24.0, 0.0, 24.0, 0.0),
|
|
child: TextFormField(
|
|
controller: widget.controller,
|
|
focusNode: widget.focusNode,
|
|
readOnly: true,
|
|
autovalidateMode: AutovalidateMode.onUserInteraction,
|
|
autofocus: false,
|
|
obscureText: false,
|
|
decoration: InputDecoration(
|
|
isDense: true,
|
|
labelStyle: FlutterFlowTheme.of(context).labelMedium.override(
|
|
fontFamily: FlutterFlowTheme.of(context).labelMediumFamily,
|
|
color: FlutterFlowTheme.of(context).primaryText,
|
|
letterSpacing: 0.0,
|
|
useGoogleFonts:
|
|
GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).labelMediumFamily),
|
|
),
|
|
hintText: widget.hintText,
|
|
hintStyle: FlutterFlowTheme.of(context).labelMedium.override(
|
|
fontFamily: FlutterFlowTheme.of(context).labelMediumFamily,
|
|
color: FlutterFlowTheme.of(context).primaryText,
|
|
letterSpacing: 0.0,
|
|
useGoogleFonts:
|
|
GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).labelMediumFamily),
|
|
lineHeight: 1.0,
|
|
),
|
|
enabledBorder: OutlineInputBorder(
|
|
borderSide: BorderSide(
|
|
color: FlutterFlowTheme.of(context).customColor6,
|
|
width: 0.5,
|
|
),
|
|
borderRadius: BorderRadius.circular(10.0),
|
|
),
|
|
focusedBorder: OutlineInputBorder(
|
|
borderSide: BorderSide(
|
|
color: FlutterFlowTheme.of(context).primary,
|
|
width: 0.5,
|
|
),
|
|
borderRadius: BorderRadius.circular(10.0),
|
|
),
|
|
errorBorder: OutlineInputBorder(
|
|
borderSide: BorderSide(
|
|
color: FlutterFlowTheme.of(context).error,
|
|
width: 0.5,
|
|
),
|
|
borderRadius: BorderRadius.circular(10.0),
|
|
),
|
|
focusedErrorBorder: OutlineInputBorder(
|
|
borderSide: BorderSide(
|
|
color: FlutterFlowTheme.of(context).error,
|
|
width: 0.5,
|
|
),
|
|
borderRadius: BorderRadius.circular(10.0),
|
|
),
|
|
suffixIcon: Icon(
|
|
Icons.date_range,
|
|
color: FlutterFlowTheme.of(context).accent1,
|
|
),
|
|
),
|
|
style: FlutterFlowTheme.of(context).bodyMedium.override(
|
|
fontFamily: FlutterFlowTheme.of(context).bodyMediumFamily,
|
|
letterSpacing: 0.0,
|
|
useGoogleFonts: GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).bodyMediumFamily),
|
|
lineHeight: 1.8,
|
|
),
|
|
textAlign: TextAlign.start,
|
|
validator: widget.validator,
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsetsDirectional.fromSTEB(24.0, 0.0, 24.0, 0.0),
|
|
child: InkWell(
|
|
splashColor: Colors.transparent,
|
|
focusColor: Colors.transparent,
|
|
hoverColor: Colors.transparent,
|
|
highlightColor: Colors.transparent,
|
|
onTap: () => _selectDate(context),
|
|
child: Container(
|
|
width: double.infinity,
|
|
height: 80.0,
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.circular(10.0),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
}
|