kurdish_date_picker
A professional, highly customizable Kurdish-first Date Picker and Calendar for Flutter.
Full Kurdish support · RTL · Kurdish numerals · Single / Range / Multiple selection · Material 3 · Light & Dark
kurdish_date_picker is a genuine, reusable Kurdish Date Picker built from scratch for
Flutter — not a wrapper around Flutter's default showDatePicker. It gives Kurdish
developers and Kurdish-language applications a first-class date-selection experience with
proper RTL layout, Kurdish Sorani day and month names, Kurdish numerals, and a
modern, customizable UI.
Screenshots taken from the bundled
example/application (Kurdish Sorani, RTL).
Basic picker — single selection with event indicators Month picker — RTL grid with Arabic-Indic numerals ٠١٢٣٤٥٦٧٨٩Customization — live theme colors, radius, cell & text size Range picker — inclusive start → end selection Multiple selection — any number of days Restrictions — firstDate,lastDate,disabledDates
✨ Features
- 🇮🇶 Kurdish Sorani first-class localization (RTL, weekday/month names)
- 🔢 Kurdish numerals (
٢٠٢٦), plus Latin - 📅 Single, range, and multiple date selection
- 🗓 Dialog APIs:
showKurdishDatePicker,showKurdishDateRangePicker,showKurdishDateMultiPicker - 🌗 Light and dark mode with seamless
ThemeDataintegration - 🎨 Full theming (
KurdishDatePickerTheme) - 📛 Date restricting:
firstDate,lastDate,disabledDates,selectableDayPredicate - 📌 Weekend configuration and styling
- 🗒 Today button
- 🗂 Month and Year pickers
- ⌨️ Date input field with localized parsing
- 📆 Calendar events with indicators, hover tooltips and "+N" overflow
- 🕐 Configurable week start (
weekStart) - 🎮
KurdishCalendarControllerfor programmatic navigation/selection - ☪️ Hijri (Islamic) date conversion (
KurdishHijriDate) - 📐 Responsive sizing that is proportional across phone/tablet/desktop/web
- ♿ Accessibility (Semantics, keyboard, focus)
- 🎞 Optional animations
- 🧱 Material 3 ready, no deprecated APIs
- 🔒 Offline-first, zero unnecessary dependencies
🚀 Installation
Add the dependency to your pubspec.yaml:
dependencies:
kurdish_date_picker: ^1.3.0
Then run:
flutter pub get
📖 Basic Usage
Drop a KurdishDatePicker anywhere in your widget tree:
import 'package:flutter/material.dart';
import 'package:kurdish_date_picker/kurdish_date_picker.dart';
class MyScreen extends StatelessWidget {
const MyScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: KurdishDatePicker(
initialDate: DateTime.now(),
firstDate: DateTime(1900),
lastDate: DateTime(2100),
locale: KurdishLocale.sorani, // Kurdish Sorani
numberSystem: NumberSystem.kurdish, // ٢٠٢٦ style numerals
selectionMode: DateSelectionMode.single,
showTodayButton: true, // ئەمڕۆ
onDateSelected: (date) {
print('Selected: $date');
},
),
),
);
}
}
📱 Dialog API
Just like Flutter's showDatePicker, the package provides convenient dialog helpers:
Single date
final date = await showKurdishDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(1900),
lastDate: DateTime(2100),
locale: KurdishLocale.sorani,
numberSystem: NumberSystem.kurdish,
);
Date range
final range = await showKurdishDateRangePicker(
context: context,
initialDate: DateTime.now(),
);
if (range != null) {
print('Start: ${range.start}');
print('End: ${range.end}');
}
Multiple dates
final dates = await showKurdishDateMultiPicker(
context: context,
initialDate: DateTime.now(),
);
if (dates != null) {
print('Selected ${dates.length} dates');
}
🗓 Range Picker (inline)
KurdishDatePicker(
locale: KurdishLocale.sorani,
numberSystem: NumberSystem.kurdish,
selectionMode: DateSelectionMode.range,
onRangeSelected: (start, end) {
print('$start → $end');
},
)
🔢 Kurdish Numerals
Convert any number or date string to Kurdish or Latin digits. The Kurdish UI
uses the Arabic-Indic digit set (٠١٢٣٤٥٦٧٨٩), matching Kurdish typographic
conventions.
import 'package:kurdish_date_picker/kurdish_date_picker.dart';
KurdishNumberFormatter.toKurdish(2026); // "٢٠٢٦"
KurdishNumberFormatter.toArabic(2026); // "٢٠٢٦"
KurdishNumberFormatter.toLatin(2026); // "2026"
KurdishNumberFormatter.toLatinString('٢١٢'); // "212"
// Pick the numeral system used in the UI:
KurdishDatePicker(
numberSystem: NumberSystem.kurdish,
// or numberSystem: NumberSystem.arabic,
// or numberSystem: NumberSystem.latin,
)
🗣 Localization
The primary locale is Sorani Kurdish. Kurmanji, Arabic, and English are built in and share the same architecture.
KurdishDatePicker(
locale: KurdishLocale.sorani, // primary
// locale: KurdishLocale.kurmanji,
// locale: KurdishLocale.arabic,
// locale: KurdishLocale.english,
)
- All month/weekday names and UI strings come from a dedicated localization layer (never hard-coded in widgets).
- Kurdish locales are RTL by default; you can force direction with
textDirection.
KurdishDatePicker(
locale: KurdishLocale.sorani,
textDirection: TextDirection.rtl, // locked to RTL
)
Navigation arrows automatically flip in RTL.
🗒 "Today" Button
KurdishDatePicker(
showTodayButton: true,
todayText: 'ئەمڕۆ', // optional custom text
)
🚫 Date Restrictions
KurdishDatePicker(
firstDate: DateTime(2020),
lastDate: DateTime(2030),
disabledDates: [
DateTime(2026, 9, 10),
DateTime(2026, 9, 15),
],
selectableDayPredicate: (date) {
// Example: disable Fridays.
return date.weekday != DateTime.friday;
},
)
Weekend styling can be configured via weekendDays:
KurdishDatePicker(
weekendDays: { DateTime.friday },
)
📆 Calendar Events
Display optional event indicators under dates (fully optional). Multiple events can share the same day; hovering (desktop) or long-pressing (touch) shows a tooltip listing every event title, and more than three events collapse into a compact "+N" indicator.
final events = [
KurdishCalendarEvent(
date: DateTime(2026, 9, 3),
title: 'چاوپێکەوتن', // "Meeting"
),
KurdishCalendarEvent(
date: DateTime(2026, 9, 3),
title: 'نانی نیوەڕۆ', // "Lunch"
),
];
KurdishDatePicker(
events: events,
onDateSelected: (date) {},
)
🕐 Week Start
Choose which weekday begins each row. Accepts a DateTime.weekday value
(1 = Monday ... 7 = Sunday). Works on the widget, the calendar, and every dialog.
KurdishDatePicker(
weekStart: DateTime.saturday, // weekends-first Kurdish layout
onDateSelected: (date) {},
)
📐 Responsive Sizing
The picker scales proportionally to the available screen: cells, header and
typography grow on tablets/desktops and shrink on small phones, so it fits every
display. Enable it on KurdishDatePicker, KurdishCalendar, the dialog show*
functions, or via the theme.
KurdishDatePicker(
responsive: true, // auto-scale to the screen
onDateSelected: (date) {},
)
// Optionally force a fixed multiplier (0.7 - 1.5).
KurdishDatePicker(
responsive: true,
scaleFactor: 1.1,
onDateSelected: (date) {},
)
// Or via the theme:
KurdishDatePicker(
themeData: const KurdishDatePickerTheme(
responsive: true,
),
onDateSelected: (date) {},
)
🎮 Calendar Controller
Use KurdishCalendarController to drive the calendar programmatically, e.g. from
buttons outside the widget tree.
final controller = KurdishCalendarController();
KurdishDatePicker(
controller: controller,
onDateSelected: (date) {},
);
// Later, from anywhere:
controller.nextMonth();
controller.previousMonth();
controller.goToDate(DateTime(2027, 1, 1));
controller.goToToday();
controller.selectDate(DateTime(2026, 12, 25));
controller.clear();
The controller is a
ChangeNotifier. Callcontroller.dispose()when you are done with it (e.g. in aState.dispose).
☪️ Hijri (Islamic) Dates
Convert between Gregorian and the arithmetic ("tabular") Hijri calendar:
final hijri = KurdishHijriDate.fromGregorian(DateTime(2026, 9, 3));
print(hijri.toGregorian()); // back to the original date
print(hijri.year); // Hijri year
print(hijri.month); // Hijri month (1-12)
print(hijri.day); // Hijri day (1-30)
// Localized, numeral-aware formatting:
final localization = KurdishDateFormatter.localization(KurdishLocale.sorani);
final text = hijri.format(
monthName: localization.hijriMonthNames[hijri.month - 1],
formatInt: (v) => KurdishNumberFormatter.toSystem(v, NumberSystem.kurdish),
);
// Or use the formatter directly:
KurdishDateFormatter.formatHijri(
DateTime(2026, 9, 3),
locale: KurdishLocale.sorani,
numberSystem: NumberSystem.kurdish,
);
🧸 Theme System
Customize nearly everything with KurdishDatePickerTheme. Unspecified values fall back to
the ambient ThemeData so light/dark work automatically.
KurdishDatePicker(
themeData: const KurdishDatePickerTheme(
selectedColor: Colors.blue,
todayColor: Colors.green,
weekendColor: Colors.red,
borderRadius: BorderRadius.all(Radius.circular(16)),
headerColor: Colors.deepPurple,
headerTextColor: Colors.white,
),
)
Available theme fields:
| Field | Description |
|---|---|
selectedColor |
Selected day background |
todayColor |
Today highlight |
weekendColor |
Weekend labels |
disabledColor |
Disabled dates |
textColor |
Default text |
headerColor / headerTextColor |
Calendar header |
backgroundColor |
Calendar background |
borderRadius |
Corner radius |
textTheme |
Typography |
cellSize / headerHeight |
Sizing |
spacing |
Grid spacing |
elevation |
Dialog elevation |
eventColor |
Event indicator color |
responsive |
Scale proportionally to screen size |
scaleFactor |
Manual responsive scale multiplier |
rangeStartColor / rangeEndColor / rangeInBetweenColor |
Range band colors |
🌗 Light & Dark Mode
The picker integrates with ThemeData directly — no extra work needed.
MaterialApp(
theme: ThemeData(useMaterial3: true, brightness: Brightness.light),
darkTheme: ThemeData(useMaterial3: true, brightness: Brightness.dark),
themeMode: ThemeMode.system,
)
📅 Date Formatting
import 'package:kurdish_date_picker/kurdish_date_picker.dart';
KurdishDateFormatter.format(
DateTime(2026, 9, 3),
locale: KurdishLocale.sorani,
numberSystem: NumberSystem.kurdish,
);
// "٣ ئەیلوول ٢٠٢٦"
KurdishDateFormatter.formatNumeric(DateTime(2026, 6, 15));
// "١٥/٠٦/٢٠٢٦"
💬 Date Input Field
An optional text field that accepts and formats Kurdish dates.
KurdishDateInput(
locale: KurdishLocale.sorani,
numberSystem: NumberSystem.kurdish,
initialDate: DateTime.now(),
onDateChanged: (date) {
// `date` is null whenever the input is invalid or incomplete.
},
onSubmitted: (date) {
print(date);
},
)
🗂 Month & Year Pickers
// Month picker
KurdishMonthPicker(
locale: KurdishLocale.sorani,
year: 2026,
selectedMonth: 9,
onMonthSelected: (month) {},
)
// Year picker
KurdishYearPicker(
firstYear: 2000,
lastYear: 2030,
selectedYear: 2026,
onYearSelected: (year) {},
)
🧱 API Reference
| Widget / Function | Description |
|---|---|
KurdishDatePicker |
Main embeddable picker widget |
KurdishCalendar |
Lower-level month calendar widget |
KurdishMonthPicker |
Standalone month grid picker |
KurdishYearPicker |
Standalone year grid picker |
KurdishDateInput |
Kurdish date text field |
showKurdishDatePicker |
Single date dialog |
showKurdishDateRangePicker |
Range dialog |
showKurdishDateMultiPicker |
Multiple date dialog |
KurdishDateFormatter |
Formatting helpers |
KurdishNumberFormatter |
Numeral conversion helpers |
KurdishDatePickerTheme |
Theme configuration |
KurdishCalendarEvent |
Event model |
KurdishHijriDate |
Hijri (Islamic) date conversion model |
KurdishCalendarController |
Programmatic navigation/selection controller |
KurdishDateRange |
Immutable date range model |
KurdishLocale |
Supported locales |
DateSelectionMode |
single | range | multiple |
NumberSystem |
latin | arabic | kurdish |
📦 Dependencies
The package keeps runtime dependencies to an absolute minimum:
| Package | Reason |
|---|---|
intl |
Standard, offline pub.flutter-io.cn package used for robust locale-aware pattern formatting |
Everything else is implemented with pure Dart/Flutter.
🤝 Contributing
Please read CONTRIBUTING.md to learn how to report bugs, submit translations, or open pull requests.
📜 License
BSD 3-Clause License — Copyright © 2026 Nashwan Taha Nheli.
This package is open source and freely usable in your own projects under the BSD 3-Clause License. Any copy or derivative must retain the above copyright notice, and the author's name may not be used to endorse products derived from this software without prior written permission.
❓ FAQ
Why not just translate Flutter's showDatePicker?
This package is a genuine calendar/date-picker UI system built from scratch with
Kurdish-first localization (RTL, numerals, names). It is not a wrapper.
Does it convert dates to a Kurdish calendar?
Internally it uses Gregorian DateTime. There is also a built-in Hijri
(Islamic) calendar converter (KurdishHijriDate and
KurdishDateFormatter.toHijri/formatHijri) for displaying lunar dates.
Does it require internet? No. It is fully offline-first.
What Flutter version do I need? Flutter 3.10+ and Dart 3.0+.
Developed with ❤️ for the Kurdish developer community.
Nashwan Taha Nheli
Libraries
- kurdish_date_picker
- A professional, highly customizable Kurdish-first Date Picker and Calendar for Flutter with full Kurdish Sorani support.





