Skip to main content
Chromia UI provides three picker components for temporal selections: ChromiaDatePicker, ChromiaTimePicker, and ChromiaDateTimePicker.

ChromiaDatePicker

A customizable date picker field.

Basic Usage

import 'package:chromia_ui/chromia_ui.dart';

DateTime? birthDate;

ChromiaDatePicker(
  label: 'Birth Date',
  selectedDate: birthDate,
  onDateSelected: (date) => setState(() => birthDate = date),
)

With Hint Text

ChromiaDatePicker(
  label: 'Select Date',
  hintText: 'Choose a date',
  selectedDate: selectedDate,
  onDateSelected: (date) => setState(() => selectedDate = date),
)

With Helper Text

ChromiaDatePicker(
  label: 'Event Date',
  helperText: 'Select the date for your event',
  selectedDate: eventDate,
  onDateSelected: (date) => setState(() => eventDate = date),
)

With Date Range Constraints

Limit the selectable date range:
ChromiaDatePicker(
  label: 'Appointment',
  selectedDate: appointmentDate,
  firstDate: DateTime.now(), // Can't select past dates
  lastDate: DateTime.now().add(Duration(days: 90)), // Max 90 days ahead
  onDateSelected: (date) => setState(() => appointmentDate = date),
)

With Custom Date Format

import 'package:intl/intl.dart';

ChromiaDatePicker(
  label: 'Date',
  selectedDate: selectedDate,
  dateFormat: DateFormat('yyyy-MM-dd'), // Custom format
  onDateSelected: (date) => setState(() => selectedDate = date),
)

With Error State

ChromiaDatePicker(
  label: 'Required Date',
  errorText: selectedDate == null ? 'Please select a date' : null,
  selectedDate: selectedDate,
  onDateSelected: (date) => setState(() => selectedDate = date),
)

Custom Icon

ChromiaDatePicker(
  label: 'Birthday',
  prefixIcon: Icons.cake,
  selectedDate: birthday,
  onDateSelected: (date) => setState(() => birthday = date),
)

Disabled State

ChromiaDatePicker(
  label: 'Read-only Date',
  selectedDate: DateTime.now(),
  enabled: false,
  onDateSelected: (date) {},
)

ChromiaDatePicker Parameters

onDateSelected
ValueChanged<DateTime>
required
Called when a date is selected.
selectedDate
DateTime?
Currently selected date.
label
String?
Label text displayed above the field.
hintText
String?
Hint text when no date is selected.
helperText
String?
Helper text displayed below the field.
errorText
String?
Error text displayed below the field.
prefixIcon
IconData?
Icon displayed before the date text. Defaults to Icons.calendar_today.
firstDate
DateTime?
First selectable date. Defaults to 1900.
lastDate
DateTime?
Last selectable date. Defaults to 2100.
enabled
bool
default:"true"
Whether the picker is enabled.
dateFormat
DateFormat?
Date format. Defaults to ‘MMM dd, yyyy’.

ChromiaTimePicker

A customizable time picker field.

Basic Usage

TimeOfDay? selectedTime;

ChromiaTimePicker(
  label: 'Meeting Time',
  selectedTime: selectedTime,
  onTimeSelected: (time) => setState(() => selectedTime = time),
)

With 24-Hour Format

ChromiaTimePicker(
  label: 'Time',
  selectedTime: selectedTime,
  use24HourFormat: true,
  onTimeSelected: (time) => setState(() => selectedTime = time),
)

With Helper and Error Text

ChromiaTimePicker(
  label: 'Alarm Time',
  helperText: 'Set your wake-up time',
  errorText: isValid ? null : 'Please select a time',
  selectedTime: alarmTime,
  onTimeSelected: (time) => setState(() => alarmTime = time),
)

Custom Icon

ChromiaTimePicker(
  label: 'Start Time',
  prefixIcon: Icons.schedule,
  selectedTime: startTime,
  onTimeSelected: (time) => setState(() => startTime = time),
)

ChromiaTimePicker Parameters

onTimeSelected
ValueChanged<TimeOfDay>
required
Called when a time is selected.
selectedTime
TimeOfDay?
Currently selected time.
label
String?
Label text.
hintText
String?
Hint text when no time is selected.
helperText
String?
Helper text.
errorText
String?
Error text.
prefixIcon
IconData?
Prefix icon. Defaults to Icons.access_time.
enabled
bool
default:"true"
Whether the picker is enabled.
use24HourFormat
bool
default:"false"
Whether to use 24-hour format.

ChromiaDateTimePicker

A combined date and time picker.

Basic Usage

DateTime? selectedDateTime;

ChromiaDateTimePicker(
  label: 'Event Start',
  selectedDateTime: selectedDateTime,
  onDateTimeSelected: (dateTime) => setState(() => selectedDateTime = dateTime),
)

With Date Range

ChromiaDateTimePicker(
  label: 'Appointment',
  selectedDateTime: appointmentDateTime,
  firstDate: DateTime.now(),
  lastDate: DateTime.now().add(Duration(days: 60)),
  onDateTimeSelected: (dateTime) => setState(() => appointmentDateTime = dateTime),
)

With Helper Text

ChromiaDateTimePicker(
  label: 'Deadline',
  helperText: 'Select the deadline for your task',
  selectedDateTime: deadline,
  onDateTimeSelected: (dateTime) => setState(() => deadline = dateTime),
)

Custom Icon

ChromiaDateTimePicker(
  label: 'Schedule',
  prefixIcon: Icons.event_available,
  selectedDateTime: scheduledTime,
  onDateTimeSelected: (dateTime) => setState(() => scheduledTime = dateTime),
)

ChromiaDateTimePicker Parameters

onDateTimeSelected
ValueChanged<DateTime>
required
Called when a date and time is selected.
selectedDateTime
DateTime?
Currently selected date and time.
label
String?
Label text.
hintText
String?
Hint text.
helperText
String?
Helper text.
errorText
String?
Error text.
prefixIcon
IconData?
Prefix icon. Defaults to Icons.event.
firstDate
DateTime?
First selectable date.
lastDate
DateTime?
Last selectable date.
enabled
bool
default:"true"
Whether the picker is enabled.

Use Cases

Birthday Selector

DateTime? birthday;

ChromiaDatePicker(
  label: 'Date of Birth',
  selectedDate: birthday,
  lastDate: DateTime.now(), // Can't select future dates
  firstDate: DateTime(1900),
  prefixIcon: Icons.cake,
  helperText: 'Enter your date of birth',
  onDateSelected: (date) => setState(() => birthday = date),
)

Event Scheduler

DateTime? eventStart;

ChromiaDateTimePicker(
  label: 'Event Start Time',
  selectedDateTime: eventStart,
  firstDate: DateTime.now(),
  lastDate: DateTime.now().add(Duration(days: 365)),
  helperText: 'When does your event start?',
  onDateTimeSelected: (dateTime) {
    setState(() => eventStart = dateTime);
    // Schedule event
  },
)

Alarm Clock

TimeOfDay? alarmTime;

ChromiaTimePicker(
  label: 'Wake Up Time',
  selectedTime: alarmTime,
  prefixIcon: Icons.alarm,
  use24HourFormat: true,
  helperText: 'Set your alarm',
  onTimeSelected: (time) {
    setState(() => alarmTime = time);
    // Set alarm
  },
)

Date Range Form

DateTime? startDate;
DateTime? endDate;

Column(
  children: [
    ChromiaDatePicker(
      label: 'Start Date',
      selectedDate: startDate,
      onDateSelected: (date) => setState(() => startDate = date),
    ),
    SizedBox(height: 16),
    ChromiaDatePicker(
      label: 'End Date',
      selectedDate: endDate,
      firstDate: startDate ?? DateTime.now(),
      errorText: (endDate != null && startDate != null && endDate!.isBefore(startDate!))
          ? 'End date must be after start date'
          : null,
      onDateSelected: (date) => setState(() => endDate = date),
    ),
  ],
)

Working Hours

TimeOfDay? startTime;
TimeOfDay? endTime;

Column(
  children: [
    ChromiaTimePicker(
      label: 'Work Starts',
      selectedTime: startTime,
      prefixIcon: Icons.login,
      onTimeSelected: (time) => setState(() => startTime = time),
    ),
    SizedBox(height: 16),
    ChromiaTimePicker(
      label: 'Work Ends',
      selectedTime: endTime,
      prefixIcon: Icons.logout,
      onTimeSelected: (time) => setState(() => endTime = time),
    ),
  ],
)

Build docs developers (and LLMs) love