banxiang/lib/screens/booking_screen.dart
2026-02-17 16:10:18 +08:00

165 lines
5.2 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter/material.dart';
import '../models/hospital.dart';
import '../services/medical_service.dart';
import 'payment_screen.dart';
class BookingScreen extends StatefulWidget {
final Hospital hospital;
final Doctor doctor;
const BookingScreen({
required this.hospital,
required this.doctor,
});
@override
State<BookingScreen> createState() => _BookingScreenState();
}
class _BookingScreenState extends State<BookingScreen> {
DateTime _selectedDate = DateTime.now().add(Duration(days: 1));
String _selectedTime = '上午';
final _nameController = TextEditingController();
final _phoneController = TextEditingController();
void _submit() {
if (_nameController.text.isEmpty || _phoneController.text.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('请填写就诊人信息')),
);
return;
}
final appointment = Appointment(
id: DateTime.now().toString(),
hospitalName: widget.hospital.name,
doctorName: widget.doctor.name,
department: widget.doctor.department,
time: _selectedDate,
status: '待支付',
fee: widget.doctor.fee,
);
MedicalService.addAppointment(appointment);
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (_) => PaymentScreen(appointment: appointment)),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('预约挂号')),
body: SingleChildScrollView(
padding: EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('医生信息', style: TextStyle(fontSize: 18, fontWeight: FontWeight.w500)),
SizedBox(height: 12),
Card(
child: Padding(
padding: EdgeInsets.all(16),
child: Column(
children: [
_buildRow('医院', widget.hospital.name),
_buildRow('科室', widget.doctor.department),
_buildRow('医生', widget.doctor.name),
_buildRow('职称', widget.doctor.title),
_buildRow('挂号费', '¥${widget.doctor.fee}'),
],
),
),
),
SizedBox(height: 24),
Text('选择时间', style: TextStyle(fontSize: 18, fontWeight: FontWeight.w500)),
SizedBox(height: 12),
Row(
children: [
Expanded(
child: Text('${_selectedDate.month}${_selectedDate.day}'),
),
TextButton(
onPressed: () async {
final date = await showDatePicker(
context: context,
initialDate: _selectedDate,
firstDate: DateTime.now(),
lastDate: DateTime.now().add(Duration(days: 30)),
);
if (date != null) setState(() => _selectedDate = date);
},
child: Text('选择日期'),
),
],
),
Row(
children: [
Radio(
value: '上午',
groupValue: _selectedTime,
onChanged: (val) => setState(() => _selectedTime = val!),
),
Text('上午'),
SizedBox(width: 20),
Radio(
value: '下午',
groupValue: _selectedTime,
onChanged: (val) => setState(() => _selectedTime = val!),
),
Text('下午'),
],
),
SizedBox(height: 24),
Text('就诊人信息', style: TextStyle(fontSize: 18, fontWeight: FontWeight.w500)),
SizedBox(height: 12),
TextField(
controller: _nameController,
decoration: InputDecoration(
labelText: '姓名',
border: OutlineInputBorder(),
),
),
SizedBox(height: 12),
TextField(
controller: _phoneController,
keyboardType: TextInputType.phone,
decoration: InputDecoration(
labelText: '手机号',
border: OutlineInputBorder(),
),
),
SizedBox(height: 40),
SizedBox(
width: double.infinity,
height: 50,
child: ElevatedButton(
onPressed: _submit,
style: ElevatedButton.styleFrom(
backgroundColor: Color(0xFF333333),
foregroundColor: Colors.white,
),
child: Text('提交订单', style: TextStyle(fontSize: 16)),
),
),
],
),
),
);
}
Widget _buildRow(String label, String value) {
return Padding(
padding: EdgeInsets.symmetric(vertical: 4),
child: Row(
children: [
Text('$label', style: TextStyle(color: Colors.grey)),
Text(value),
],
),
);
}
}