import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:intl/intl.dart'; // 用于日期格式化 class ReservationController extends GetxController { /// --- 状态变量 --- // 【修改】使用 Rx 变量,让 GetX 的 Obx/GetX 能够自动监听变化,UI更新更简单 // 日期,默认为今天 final Rx selectedDate = DateTime.now().obs; // 开始时间,默认为当前时分 final Rx startTime = TimeOfDay.now().obs; // 结束时间,默认为开始时间后30分钟 final Rx endTime = TimeOfDay.fromDateTime(DateTime.now().add(const Duration(minutes: 30))).obs; // 预约氢量 final TextEditingController amountController = TextEditingController(); // 车牌号 final TextEditingController plateNumberController = TextEditingController(); // 加氢站 final List stationOptions = ['诚志AP银河路加氢站', '站点B', '站点C']; final Rx selectedStation = '诚志AP银河路加氢站'.obs; // --- 用于UI显示的格式化字符串 (Getters) --- String get formattedDate => DateFormat('yyyy-MM-dd').format(selectedDate.value); // 使用 context-aware 的 format 方法 String get formattedStartTime => startTime.value.format(Get.context!); String get formattedEndTime => endTime.value.format(Get.context!); /// --- 交互方法 --- /// 【修改】显示 Flutter 内置的日期选择器 void pickDate(BuildContext context) async { // 改为 async final DateTime? pickedDate = await showDatePicker( context: context, initialDate: selectedDate.value, firstDate: DateTime.now(), // 只能从今天开始选 lastDate: DateTime.now().add(const Duration(days: 365)), // 假设最多预约一年内 helpText: '选择预约日期', confirmText: '确定', cancelText: '取消', ); if (pickedDate != null && pickedDate != selectedDate.value) { selectedDate.value = pickedDate; } } /// 【修改】显示 Flutter 内置的时间选择器 void pickTime(BuildContext context, bool isStartTime) async { // 改为 async TimeOfDay initialTime = isStartTime ? startTime.value : endTime.value; final TimeOfDay? pickedTime = await showTimePicker( context: context, initialTime: initialTime, helpText: isStartTime ? '选择开始时间' : '选择结束时间', confirmText: '确定', cancelText: '取消', ); if (pickedTime != null) { if (isStartTime) { startTime.value = pickedTime; // 如果新的开始时间晚于或等于结束时间,自动将结束时间设置为开始时间后30分钟 if ((pickedTime.hour * 60 + pickedTime.minute) >= (endTime.value.hour * 60 + endTime.value.minute)) { final newDateTime = DateTime( selectedDate.value.year, selectedDate.value.month, selectedDate.value.day, pickedTime.hour, pickedTime.minute) .add(const Duration(minutes: 30)); endTime.value = TimeOfDay.fromDateTime(newDateTime); } } else { // 确保结束时间不早于开始时间 if ((pickedTime.hour * 60 + pickedTime.minute) > (startTime.value.hour * 60 + startTime.value.minute)) { endTime.value = pickedTime; } else { // 如果选择了更早的时间,给出提示 Get.snackbar( '时间选择错误', '结束时间必须晚于开始时间', snackPosition: SnackPosition.BOTTOM, backgroundColor: Colors.red, colorText: Colors.white, ); } } } } /// 提交预约 void submitReservation() { // TODO: 在这里执行提交预约的逻辑 print('提交预约:'); print('日期: $formattedDate'); print('开始时间: $formattedStartTime'); print('结束时间: $formattedEndTime'); print('预约氢量: ${amountController.text}'); print('车牌号: ${plateNumberController.text}'); print('加氢站: ${selectedStation.value}'); Get.snackbar('成功', '预约已提交!', snackPosition: SnackPosition.BOTTOM); } @override void onClose() { amountController.dispose(); plateNumberController.dispose(); super.onClose(); } }