refactor: 穿搭页删标题、日期改为同排两个日期框

This commit is contained in:
2026-07-31 17:13:49 +08:00
parent 2a07f7d052
commit 24559417ad
+57 -25
View File
@@ -17,7 +17,8 @@ class OutfitPage extends ConsumerStatefulWidget {
}
class _OutfitPageState extends ConsumerState<OutfitPage> {
DateTimeRange? _dateRange;
DateTime? _startDate;
DateTime? _endDate;
final _locationCtrl = TextEditingController();
String _occasion = '通勤';
bool _submitting = false;
@@ -30,40 +31,62 @@ class _OutfitPageState extends ConsumerState<OutfitPage> {
super.dispose();
}
Future<void> _pickDateRange() async {
Future<void> _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<void> _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<void> _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<OutfitPage> {
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<OutfitPage> {
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(