import 'package:ef/ef.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:vbvs_app/common/color/appConstants.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/controller/theme_controller/ThemeController.dart'; Future showDateSelectionDialog(BuildContext context, {required DateTime checkDate, Function? checkChange, String title = "生日"}) { ThemeController themeController = Get.find(); List years = [], months = [], days = []; var days_select = [].obs; int day_len = 31; int year = DateTime.now().year; for (var i = 0; i < 100; i++) { years.insert(0, year - i); } for (var i = 1; i < 13; i++) { months.add(i); } for (var i = 1; i < 32; i++) { days.add(i); } int yearIndex = years.lastIndexOf(checkDate.year); int monthIndex = months.lastIndexOf(checkDate.month); day_len = DateTime.fromMillisecondsSinceEpoch( DateTime(years[yearIndex], months[monthIndex] + 1) .millisecondsSinceEpoch - 1000) .day; days_select.value = days.sublist(0, day_len); int dayIndex = days.lastIndexOf(checkDate.day); return showDialog( context: context, barrierDismissible: true, // 点击对话框外部可关闭 builder: (BuildContext context) { return Stack( children: [ Positioned( bottom: 0, // 控制弹窗距离顶部的位置 left: 0, right: 0, child: Material( color: Colors.transparent, child: Dialog( backgroundColor: themeController.currentColor.sc17, insetPadding: EdgeInsets.zero, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(0), ), child: Container( width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.only( topLeft: Radius.circular( AppConstants().normal_container_radius), topRight: Radius.circular( AppConstants().normal_container_radius), bottomLeft: Radius.circular(0.rpx), bottomRight: Radius.circular(0.rpx), ), ), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.center, children: [ Container( color: themeController.currentColor.sc5, alignment: Alignment.centerLeft, height: 80.rpx, child: Padding( padding: EdgeInsets.only(left: 30.rpx, right: 30.rpx), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ InkWell( child: Text( "日期.取消".tr, style: TextStyle( fontFamily: 'Readex Pro', color: themeController.currentColor.sc3, letterSpacing: 0, fontSize: AppConstants().normal_text_fontSize), ), onTap: () { Get.back(); }, ), Text( "$title", style: TextStyle( fontFamily: 'Readex Pro', color: themeController.currentColor.sc3, letterSpacing: 0, fontSize: AppConstants().title_text_fontSize), ), // closeIconWhite, InkWell( child: Text( "日期.确定".tr, style: TextStyle( fontFamily: 'Readex Pro', color: themeController.currentColor.sc2, letterSpacing: 0, fontSize: AppConstants().normal_text_fontSize), ), onTap: () { checkChange?.call(DateTime(years[yearIndex], months[monthIndex], days[dayIndex])); Get.back(); }, ) ], ), ), ), Container( height: 240.rpx, margin: EdgeInsets.only(top: 60.rpx, bottom: 60.rpx), padding: EdgeInsets.symmetric(horizontal: 30.rpx), child: Row( mainAxisAlignment: MainAxisAlignment.center, // ✅ 整体居中 crossAxisAlignment: CrossAxisAlignment.center, children: [ Row( children: [ SizedBox( width: 120.rpx, child: getOnePicker(context, years, yearIndex, (d) { yearIndex = d; dayIndex = 0; day_len = DateTime.fromMillisecondsSinceEpoch( DateTime( years[yearIndex], months[monthIndex] + 1) .millisecondsSinceEpoch - 1000) .day; days_select.value = days.sublist(0, day_len); }, "年".tr), ), ], ), SizedBox(width: 100.rpx), // 月 Row( children: [ SizedBox( width: 80.rpx, child: getOnePicker( context, months, monthIndex, (d) { monthIndex = d; dayIndex = 0; day_len = DateTime.fromMillisecondsSinceEpoch( DateTime( years[yearIndex], months[monthIndex] + 1) .millisecondsSinceEpoch - 1000) .day; days_select.value = days.sublist(0, day_len); }, "月".tr), ), ], ), SizedBox(width: 100.rpx), Row( children: [ SizedBox( width: 80.rpx, child: Obx(() { return getOnePicker( context, days_select, dayIndex, (d) { dayIndex = d; }, "日".tr); }), ), ], ), ], ), ) ], ), ), ), ), ), ], ); }, ); } TextStyle _unitStyle(BuildContext context) { return TextStyle( fontFamily: 'Readex Pro', color: themeController.currentColor.sc3, fontSize: 30.rpx, letterSpacing: 0, ); } getOnePicker(BuildContext context, List arr, int checkIndex, Function onSelectedItemChanged, String unit, {bool looping = false}) { ThemeController themeController = Get.find(); return CupertinoPicker( key: UniqueKey(), useMagnifier: false, itemExtent: 80.rpx, magnification: 1, diameterRatio: 3, squeeze: 1, looping: looping, scrollController: FixedExtentScrollController(initialItem: checkIndex), selectionOverlay: Container(), // 不要默认选中遮罩 onSelectedItemChanged: (int value) { onSelectedItemChanged.call(value); }, children: List.generate(arr.length, (index) { return Container( alignment: Alignment.center, child: Text( "${arr[index]}$unit", // ✅ 每项都带单位 style: TextStyle( fontFamily: 'Readex Pro', color: themeController.currentColor.sc3, fontSize: 30.rpx, ), ), ); }), ); }