更新样式

This commit is contained in:
wyf
2025-08-27 10:45:33 +08:00
parent 92e92f4db7
commit dc647ea43c
25 changed files with 1569 additions and 619 deletions

View File

@@ -8,39 +8,339 @@ import 'package:vbvs_app/component/tool/ClickableContainer.dart';
import 'package:vbvs_app/controller/theme_controller/ThemeController.dart';
import 'package:vbvs_app/pages/common/selectDialog.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: 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);
// // }),
// // ),
// // ],
// // ),
// // ],
// // ),
// // )
// //-----
// Container(
// height: 240.rpx,
// margin: EdgeInsets.only(top: 60.rpx, bottom: 60.rpx),
// padding: EdgeInsets.symmetric(horizontal: 30.rpx),
// child: Stack(
// children: [
// // ✅ 选中行背景色
// Positioned.fill(
// child: IgnorePointer(
// child: Center(
// child: Container(
// height: 90.rpx, // 对齐选中行高度
// margin: EdgeInsets.symmetric(
// horizontal: 10.rpx),
// decoration: BoxDecoration(
// color: themeController.currentColor.sc2,
// borderRadius:
// BorderRadius.circular(16.rpx),
// ),
// ),
// ),
// ),
// ),
// // ✅ 三列 Picker
// Row(
// mainAxisAlignment:
// MainAxisAlignment.center, // 整体居中
// crossAxisAlignment: CrossAxisAlignment.center,
// 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),
// // 月
// 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),
// // 日
// SizedBox(
// width: 80.rpx,
// child: Obx(() {
// return getOnePicker(
// context, days_select, dayIndex, (d) {
// dayIndex = d;
// }, "".tr);
// }),
// ),
// ],
// ),
// ],
// ),
// ),
// ],
// ),
// ),
// ),
// ),
// ),
// ],
// );
// },
// );
// }
Future showDateSelectionDialog(BuildContext context,
{required DateTime checkDate, Function? checkChange, String title = "生日"}) {
{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);
final bool isEn = Get.locale?.languageCode.startsWith('en') ?? false;
Color checkColor = stringToColor("#D3B684");
final List<int> years = List.generate(100, (i) => DateTime.now().year - i)
..sort();
final List<int> months = List.generate(12, (i) => i + 1);
final List<int> days = List.generate(31, (i) => i + 1);
final RxList<int> daysSelect = <int>[].obs;
final RxInt yearIndex = years.indexOf(checkDate.year).obs;
final RxInt monthIndex = months.indexOf(checkDate.month).obs;
final RxInt dayIndex = days.indexOf(checkDate.day).obs;
void updateDays() {
final int daysInMonth =
DateTime(years[yearIndex.value], months[monthIndex.value] + 1, 0).day;
daysSelect.value = days.sublist(0, daysInMonth);
if (dayIndex.value >= daysInMonth) {
dayIndex.value = daysInMonth - 1;
}
}
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);
updateDays();
return showDialog(
context: context,
barrierDismissible: true, // 点击对话框外部可关闭
barrierDismissible: true,
builder: (BuildContext context) {
return Stack(
children: [
Positioned(
bottom: 0, // 控制弹窗距离顶部的位置
bottom: 0,
left: 0,
right: 0,
child: Material(
@@ -53,151 +353,145 @@ Future showDateSelectionDialog(BuildContext context,
),
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),
),
),
padding: EdgeInsets.fromLTRB(30.rpx, 10.rpx, 30.rpx, 90.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,
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ClickableContainer(
backgroundColor: Colors.transparent,
highlightColor: Colors.transparent,
padding: EdgeInsets.zero,
onTap: () => Navigator.of(context).pop(),
child: Container(
width: 110.rpx,
height: 60.rpx,
alignment: Alignment.center,
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();
},
)
],
fontSize: 30.rpx, color: Colors.white)),
),
),
),
Text(
title,
style: TextStyle(
fontFamily: 'Readex Pro',
color: themeController.currentColor.sc3,
fontSize: 30.rpx,
),
),
ClickableContainer(
backgroundColor: Colors.transparent,
highlightColor: Colors.transparent,
padding: EdgeInsets.zero,
onTap: () {
final selectedDate = DateTime(
years[yearIndex.value],
months[monthIndex.value],
daysSelect[dayIndex.value],
);
checkChange?.call(selectedDate);
Get.back();
},
child: Container(
width: 110.rpx,
height: 60.rpx,
alignment: Alignment.center,
child: Text("确定".tr,
style: TextStyle(
fontSize: 30.rpx,
color: themeController.currentColor.sc2,
)),
),
),
],
),
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(height: 20.rpx),
Stack(
children: [
Positioned.fill(
child: IgnorePointer(
child: Center(
child: Container(
height: 90.rpx,
margin:
EdgeInsets.symmetric(horizontal: 70.rpx),
decoration: BoxDecoration(
color: themeController.currentColor.sc2,
borderRadius: BorderRadius.circular(16.rpx),
),
),
],
),
),
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(
height: 240.rpx,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 95.rpx),
child: Row(
children: isEn
? [
Expanded(
child: getOnePickers(
context,
months,
monthIndex,
isMonthName: true,
onChanged: (_) => updateDays(),
),
),
Expanded(
child: getOnePickers(
context,
daysSelect,
dayIndex,
),
),
Expanded(
child: getOnePickers(
context,
years,
yearIndex,
onChanged: (_) => updateDays(),
),
),
]
: [
Expanded(
child: getOnePickers(
context,
years,
yearIndex,
unit: "",
onChanged: (_) => updateDays(),
),
),
Expanded(
child: getOnePickers(
context,
months,
monthIndex,
unit: "",
onChanged: (_) => updateDays(),
),
),
Expanded(
child: getOnePickers(
context,
daysSelect,
dayIndex,
unit: "",
),
),
],
),
),
SizedBox(width: 100.rpx),
Row(
children: [
SizedBox(
width: 80.rpx,
child: Obx(() {
return getOnePicker(
context, days_select, dayIndex, (d) {
dayIndex = d;
}, "".tr);
}),
),
],
),
],
),
)
),
],
),
],
),
),