Files
tuiche/lib/pages/person/select_time.dart
2025-05-23 14:51:09 +08:00

261 lines
11 KiB
Dart

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: <Widget>[
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: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Readex Pro',
color:
themeController.currentColor.sc3,
letterSpacing: 0,
fontSize: AppConstants()
.normal_text_fontSize),
),
onTap: () {
Get.back();
},
),
Text(
"$title",
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Readex Pro',
color: themeController.currentColor.sc3,
letterSpacing: 0,
fontSize:
AppConstants().title_text_fontSize),
),
// closeIconWhite,
InkWell(
child: Text(
"日期.确定".tr,
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
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 FlutterFlowTheme.of(context).bodyMedium.override(
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: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily: 'Readex Pro',
color: themeController.currentColor.sc3,
fontSize: 30.rpx,
),
),
);
}),
);
}