diff --git a/lib/features/outfit/outfit_page.dart b/lib/features/outfit/outfit_page.dart index 21f131a..98783f4 100644 --- a/lib/features/outfit/outfit_page.dart +++ b/lib/features/outfit/outfit_page.dart @@ -17,7 +17,8 @@ class OutfitPage extends ConsumerStatefulWidget { } class _OutfitPageState extends ConsumerState { - DateTimeRange? _dateRange; + DateTime? _startDate; + DateTime? _endDate; final _locationCtrl = TextEditingController(); String _occasion = '通勤'; bool _submitting = false; @@ -30,40 +31,62 @@ class _OutfitPageState extends ConsumerState { super.dispose(); } - Future _pickDateRange() async { + Future _pickStartDate() async { final now = DateTime.now(); - final range = await showDateRangePicker( + final date = await showDatePicker( context: context, firstDate: now, lastDate: now.add(const Duration(days: 30)), - initialDateRange: _dateRange ?? - DateTimeRange(start: now, end: now.add(const Duration(days: 2))), + initialDate: _startDate ?? now, ); - if (range != null) setState(() => _dateRange = range); + if (date == null) return; + setState(() { + _startDate = date; + if (_endDate != null && _endDate!.isBefore(date)) { + _endDate = date; + } + }); + } + + Future _pickEndDate() async { + final now = DateTime.now(); + final first = _startDate ?? now; + final date = await showDatePicker( + context: context, + firstDate: first, + lastDate: first.add(const Duration(days: 30)), + initialDate: _endDate ?? first, + ); + if (date != null) setState(() => _endDate = date); } String _fmt(DateTime d) => '${d.year}-${d.month.toString().padLeft(2, '0')}-${d.day.toString().padLeft(2, '0')}'; Future _generate() async { - final range = _dateRange; + final start = _startDate; + final end = _endDate; final location = _locationCtrl.text.trim(); - if (range == null) { - Fluttertoast.showToast(msg: '请选择日期范围'); + if (start == null) { + Fluttertoast.showToast(msg: '请选择开始日期'); + return; + } + if (end == null) { + Fluttertoast.showToast(msg: '请选择结束日期'); return; } if (location.isEmpty) { Fluttertoast.showToast(msg: '请输入地点'); return; } - if (range.duration.inDays < 1) { + if (end.difference(start).inDays < 1) { Fluttertoast.showToast(msg: '日期范围至少 1 天'); return; } setState(() => _submitting = true); final ok = await ref.read(generateProvider.notifier).generate( - startDate: _fmt(range.start), - endDate: _fmt(range.end), + startDate: _fmt(start), + endDate: _fmt(end), location: location, occasion: _occasion, ); @@ -80,7 +103,6 @@ class _OutfitPageState extends ConsumerState { Widget build(BuildContext context) { final plans = ref.watch(outfitPlanProvider); final gen = ref.watch(generateProvider); - final scheme = Theme.of(context).colorScheme; return Scaffold( appBar: AppBar(title: const Text('造型穿搭')), @@ -95,18 +117,28 @@ class _OutfitPageState extends ConsumerState { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text('生成穿搭方案', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - color: scheme.primary)), - const SizedBox(height: 12), - OutlinedButton.icon( - onPressed: _submitting ? null : _pickDateRange, - icon: const Icon(Icons.date_range_outlined), - label: Text(_dateRange == null - ? '选择日期范围' - : '${_fmt(_dateRange!.start)} ~ ${_fmt(_dateRange!.end)}'), + Row( + children: [ + Expanded( + child: OutlinedButton.icon( + onPressed: _submitting ? null : _pickStartDate, + icon: const Icon(Icons.date_range_outlined), + label: Text(_startDate == null + ? '开始日期' + : _fmt(_startDate!)), + ), + ), + const SizedBox(width: 8), + Expanded( + child: OutlinedButton.icon( + onPressed: _submitting ? null : _pickEndDate, + icon: const Icon(Icons.date_range_outlined), + label: Text(_endDate == null + ? '结束日期' + : _fmt(_endDate!)), + ), + ), + ], ), const SizedBox(height: 12), TextField(