v3.0.0hijri_picker
Hijri calender to pick umm alqura dates support max & min dates.
Flutter Widget to Pick Hijri Calendar Dates
{"sdk":"flutter"}^3.0.1{"sdk":"flutter"}{"sdk":"flutter"}English project snapshot. Visit GitHub for the latest content.
https://img.shields.io/pub/v/hijri_picker?style=flat https://img.shields.io/github/license/ahmedoid/hijri_picker?style=flat
Hijri (Umm al-Qura / Islamic calendar) date picker for Flutter.
Since v5.0.0, this package is a thin adapter that lets Flutter's built-in
Material 3 date picker render Hijri dates. It implements the
CalendarDelegate
API introduced in Flutter 3.32, so you get Flutter's showDatePicker,
CalendarDatePicker, DatePickerDialog, InputDatePickerFormField, and
YearPicker for free — with Hijri month names, Hijri weekday offsets,
Hijri month lengths, and full theming via DatePickerThemeData.
>=3.32.0^3.8.0hijri ^3.0.1 (runtime dependency)Colors.amber seed| Light home top 1. Home — top: showHijriDatePicker launchers + embedded CalendarDatePicker showing Dhu Al-Hijjah 1447, Friday 5 selected. |
Light home bottom 2. Home — bottom: InputDatePickerFormField, the embedded 3-column YearPicker (1447 selected), and the theming legend card. |
Light basic dialog 3. showHijriDatePicker — basic dialog. Header reads "Fri, 5 DhuH"; M3 mode-toggle pencil icon in the corner. |
Light full options dialog 4. Full options: custom helpText: "SELECT HIJRI DATE", uppercase cancelText/confirmText, and a selectableDayPredicate that disables Fridays (note the circled-disabled Friday 5). |
| Light input mode 5. Input mode (the pencil icon toggles to text-input). Typing 12/5/1447 in the locale's compact format — accepted by HijriCalendarDelegate.parseCompactDate. |
|||
Colors.blue seed| Dark home top 6. Same home in dark mode — Material 3 picks up the blue seed for primary/selection colors via ColorScheme.fromSeed. |
Dark home bottom 7. Dark home, scrolled: input field, year grid (1447 highlighted in blue), and the dark theming legend. |
Dark basic dialog 8. Basic showHijriDatePicker dialog in dark mode — Hijri month name in the header, blue selection chip on day 5. |
Dark full options 9. Full-options dialog in dark mode — Fridays disabled by predicate, day 6 (Saturday) selected. |
| Dark input only 10. DatePickerEntryMode.inputOnly — opens straight into a compact text field, no calendar. |
Dark scrolled 11. Dark home scrolled — Hijri year grid 1439–1450 with 1447 selected (out-of-range years 1439–1441 dimmed). |
||
| Arabic home 12. Locale switched to ar_SA via the AppBar toggle. Layout flipped to RTL; calendar uses Arabic weekday abbreviations and Eastern-Arabic digits. |
Arabic dialog 13. showHijriDatePicker dialog in Arabic. The cancelText/confirmText are still the English overrides we passed (demonstrating they take precedence over MaterialLocalizations). |
Arabic input 14. Arabic input mode — compact-date field typed as 1447/12/5. |
| Arabic embedded 15. Embedded CalendarDatePicker + InputDatePickerFormField in Arabic — same widgets, RTL layout, Arabic month name. |
Arabic year grid 16. Embedded YearPicker in Arabic — 3-column M3 year grid (1441–1450), 1447 selected. |
Register the standard Material/Widgets localization delegates:
MaterialApp(
localizationsDelegates: const [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: const [
Locale('en', 'US'),
Locale('ar', 'SA'),
],
// ...
);
showHijriDatePicker (typed convenience)final HijriDateTime now = HijriDateTime.now();
final HijriDateTime? picked = await showHijriDatePicker(
context: context,
initialDate: now,
firstDate: HijriDateTime(now.year - 5, 1, 1),
lastDate: HijriDateTime(now.year + 5, 12, 29),
hijriLanguage: 'ar', // 'en', 'ar', 'tr', or any locale added via HijriCalendar.addLocale
);
showDatePicker with HijriCalendarDelegatefinal HijriDateTime? picked = await showDatePicker(
context: context,
initialDate: HijriDateTime.now(),
firstDate: HijriDateTime(1440, 1, 1),
lastDate: HijriDateTime(1455, 12, 29),
calendarDelegate: const HijriCalendarDelegate(language: 'ar'),
) as HijriDateTime?;
The same delegate plugs into the embeddable widgets too:
CalendarDatePicker(
initialDate: HijriDateTime.now(),
firstDate: HijriDateTime(1440, 1, 1),
lastDate: HijriDateTime(1455, 12, 29),
onDateChanged: (DateTime d) => setState(() => selected = d as HijriDateTime),
calendarDelegate: const HijriCalendarDelegate(),
);
InputDatePickerFormField(
initialDate: HijriDateTime.now(),
firstDate: HijriDateTime(1440, 1, 1),
lastDate: HijriDateTime(1455, 12, 29),
onDateSubmitted: (DateTime d) { /* d is a HijriDateTime */ },
calendarDelegate: const HijriCalendarDelegate(),
);
YearPicker(
firstDate: HijriDateTime(1440, 1, 1),
lastDate: HijriDateTime(1455, 12, 29),
selectedDate: HijriDateTime.now(),
currentDate: HijriDateTime.now(), // required workaround — see note below
onChanged: (DateTime d) { /* ... */ },
calendarDelegate: const HijriCalendarDelegate(),
);
Note on
YearPicker: Flutter'sYearPickerconstructor defaultscurrentDatetoDateTime.now()(plain Gregorian) rather thancalendarDelegate.now(), which crashes with any non-Gregorian delegate. Workaround: always passcurrentDate: HijriDateTime.now()explicitly. The other entry points (CalendarDatePicker,DatePickerDialog,showDatePicker) handle this correctly.
All theming flows through Flutter's
DatePickerThemeData:
MaterialApp(
theme: ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.amber,
brightness: Brightness.light,
),
datePickerTheme: const DatePickerThemeData(
backgroundColor: Color(0xFFFFF8E1),
headerBackgroundColor: Colors.amber,
headerForegroundColor: Colors.black87,
),
),
);
HijriDateTime extends DateTime; its .year/.month/.day are the Hijri
components. Convert via:
final HijriDateTime d = HijriDateTime.now();
final HijriCalendar h = d.toHijriCalendar(); // hijri package's calendar object
final DateTime gregorian = d.toGregorian(); // equivalent Gregorian date
// Construct from sources:
HijriDateTime.fromHijriCalendar(someHijriCalendar);
HijriDateTime.fromGregorian(DateTime(2026, 5, 22));
v5.0.0 is a breaking rewrite. The custom widgets have been removed.
| 4.x | 5.x |
|---|---|
showHijriDatePicker(initialDate: HijriCalendar..) |
showHijriDatePicker(initialDate: HijriDateTime(..)) |
HijriMonthPicker widget |
Use Flutter's CalendarDatePicker with calendarDelegate: HijriCalendarDelegate() |
HijriDayPicker / HijriYearPicker widgets |
Use Flutter's built-ins (internal _DayPicker, public YearPicker) |
HijriCalendarBuilders (custom day/weekday builders) |
Removed — customize via DatePickerThemeData |
Return type HijriCalendar? |
Return type HijriDateTime? (call .toHijriCalendar() or .toGregorian() to interop) |
MIT — see LICENSE.
Ahmed Aljoaid — @ahmedoid