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

Pub version Pub likes Pub points Language: Dart


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 Kurdish date picker with events Month picker with Kurdish numerals
Basic picker — single selection with event indicators Month picker — RTL grid with Arabic-Indic numerals ٠١٢٣٤٥٦٧٨٩
Interactive theme customization Range selection
Customization — live theme colors, radius, cell & text size Range picker — inclusive start → end selection
Multiple date selection Disabled dates and restrictions
Multiple selection — any number of days RestrictionsfirstDate, 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 ThemeData integration
  • 🎨 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)
  • 🎮 KurdishCalendarController for 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. Call controller.dispose() when you are done with it (e.g. in a State.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.