cupertinoDatePicker static method

Future cupertinoDatePicker({
  1. required BuildContext context,
  2. required dynamic onChanged(
    1. String
    ),
  3. bool dontallowPastDate = false,
  4. int yearCount = 65,
})

Implementation

static Future cupertinoDatePicker({
  required BuildContext context,
  required Function(String) onChanged,
  bool dontallowPastDate = false,
  int yearCount = 65,
}) {
  var startYearDate = 1945.obs;
  var startMonthDate = 1.obs;
  var startDayDate = 1.obs;

  if (dontallowPastDate) {
    startYearDate.value = DateTime.now().year;
    startMonthDate.value = DateTime.now().month;
    startDayDate.value = DateTime.now().day;
  }

  var selectedYear = startYearDate.value.toString().obs;
  var selectedMonth = startMonthDate.value.toString().obs;
  var selectedDay = startDayDate.value.toString().obs;

  var yearList = List.generate(
    yearCount,
    (index) => {
      startYearDate.value + index: (startYearDate.value + index).toString()
    },
  ).obs;
  var monthList = <Map<int, String>>[
    {1: "Ocak"},
    {2: "Şubat"},
    {3: "Mart"},
    {4: "Nisan"},
    {5: "Mayıs"},
    {6: "Haziran"},
    {7: "Temmuz"},
    {8: "Ağustos"},
    {9: "Eylül"},
    {10: "Ekim"},
    {11: "Kasım"},
    {12: "Aralık"},
  ].obs;

  var monthEditiableList = <Map<int, String>>[
    {1: "Ocak"},
    {2: "Şubat"},
    {3: "Mart"},
    {4: "Nisan"},
    {5: "Mayıs"},
    {6: "Haziran"},
    {7: "Temmuz"},
    {8: "Ağustos"},
    {9: "Eylül"},
    {10: "Ekim"},
    {11: "Kasım"},
    {12: "Aralık"},
  ].obs;

  var dayList =
      List.generate(31, (index) => {index + 1: (index + 1).toString()}).obs;

  var editibledayList =
      List.generate(31, (index) => {index + 1: (index + 1).toString()}).obs;

  updatemonthdonwallowpastdate() {
    if (dontallowPastDate) {
      //Geçmişteki Ayları siler
      monthEditiableList.value = monthList.where((month) {
        return month.keys.first >= int.parse(selectedMonth.value);
      }).toList();
    } else {
      monthEditiableList.value = monthList.toList();
    }
  }

  void removeDaysAfter() {
    if (dontallowPastDate &&
        selectedMonth.value == startMonthDate.value.toString()) {
      editibledayList.value = dayList.where((day) {
        return day.keys.first >= int.parse(selectedDay.value);
      }).toList();
    } else {
      editibledayList.value = dayList.toList();
    }
  }

  updatemonthdonwallowpastdate();
  removeDaysAfter();

  return showCupertinoModalPopup(
    // barrierDismissible: false,
    context: context,
    builder: (BuildContext context) {
      if (selectedDay.value.length == 1) {
        selectedDay.value = "0$selectedDay";
      }
      if (selectedMonth.value.length == 1) {
        selectedMonth.value = "0$selectedMonth";
      }
      var selectedDate = "$selectedDay.$selectedMonth.$selectedYear".obs;

      return Container(
        height: 250,
        width: ARMOYU.screenWidth,
        color: Get.theme.scaffoldBackgroundColor,
        child: Column(
          children: [
            Align(
              alignment: Alignment.centerRight,
              child: GestureDetector(
                onTap: () {
                  onChanged(selectedDate.value);
                  Get.back();
                },
                child: const Padding(
                  padding: EdgeInsets.all(8.0),
                  child: Text(
                    "Bitti",
                    style: TextStyle(
                        color: Colors.lightBlue,
                        fontSize: 18,
                        fontWeight: FontWeight.normal,
                        decoration: TextDecoration.none),
                  ),
                ),
              ),
            ),
            Row(
              children: [
                SizedBox(
                  width: ARMOYU.screenWidth / 3,
                  height: 200,
                  child: Obx(
                    () => CupertinoPicker(
                      itemExtent: 32,
                      children: List.generate(
                        yearList.length,
                        (index) {
                          Map<int, String> yearMap = yearList[index];
                          return Text(yearMap.values.last.toString());
                        },
                      ),
                      onSelectedItemChanged: (value) {
                        selectedYear.value = yearList[value].values.first;

                        selectedDate.value =
                            "$selectedDay.$selectedMonth.$selectedYear";

                        updatemonthdonwallowpastdate();

                        onChanged(selectedDate.value);
                      },
                    ),
                  ),
                ),
                SizedBox(
                  width: ARMOYU.screenWidth / 3,
                  height: 150,
                  child: Obx(
                    () => CupertinoPicker(
                      itemExtent: 32,
                      children:
                          List.generate(monthEditiableList.length, (index) {
                        Map<int, String> monthMap = monthEditiableList[index];
                        return Text(monthMap.values.last.toString());
                      }),
                      onSelectedItemChanged: (value) {
                        Map<int, String> monthMap = monthEditiableList[value];
                        selectedMonth.value = monthMap.keys.first.toString();

                        editibledayList.value = List.generate(
                          findDaysInMonth(int.parse(selectedYear.value),
                              int.parse(selectedMonth.value)),
                          (index) => {index + 1: (index + 1).toString()},
                        );

                        selectedDate.value =
                            "$selectedDay.$selectedMonth.$selectedYear";

                        removeDaysAfter();
                        onChanged(selectedDate.value);
                      },
                    ),
                  ),
                ),
                SizedBox(
                  width: ARMOYU.screenWidth / 3,
                  height: 150,
                  child: Obx(
                    () => CupertinoPicker(
                      itemExtent: 32,
                      children: List.generate(
                        editibledayList.length,
                        (index) {
                          Map<int, String> dayMap = editibledayList[index];
                          return Text(dayMap.values.last.toString());
                        },
                      ),
                      onSelectedItemChanged: (value) {
                        Map<int, String> dayMap = editibledayList[value];
                        selectedDay.value = dayMap.keys.first.toString();

                        selectedDate.value =
                            "$selectedDay.$selectedMonth.$selectedYear";
                        onChanged(selectedDate.value);
                      },
                    ),
                  ),
                ),
              ],
            ),
          ],
        ),
      );
    },
  );
}