refactor: 穿搭页删标题、日期改为同排两个日期框
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user