94 lines
2.8 KiB
Dart
94 lines
2.8 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
import '../../../providers/bill_provider.dart';
|
|
import '../../../utils/date_util.dart';
|
|
|
|
/// 月份切换条:‹ 2026年9月 ›
|
|
class MonthSwitcher extends ConsumerWidget {
|
|
const MonthSwitcher({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
final anchor = ref.watch(monthAnchorProvider);
|
|
final notifier = ref.read(monthAnchorProvider.notifier);
|
|
|
|
return Container(
|
|
padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2),
|
|
decoration: BoxDecoration(
|
|
color: Colors.white.withValues(alpha: 0.85),
|
|
borderRadius: BorderRadius.circular(20),
|
|
),
|
|
child: Row(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
_iconButton(
|
|
icon: Icons.chevron_left,
|
|
tooltip: '上一月',
|
|
onTap: notifier.prev,
|
|
),
|
|
GestureDetector(
|
|
onTap: () => _pickMonth(context, ref),
|
|
child: Padding(
|
|
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6),
|
|
child: Row(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Text(
|
|
formatMonthTitle(anchor),
|
|
style: const TextStyle(
|
|
fontSize: 14,
|
|
fontWeight: FontWeight.w600,
|
|
color: Color(0xFF5D4037),
|
|
),
|
|
),
|
|
const SizedBox(width: 4),
|
|
const Icon(Icons.arrow_drop_down, size: 18, color: Color(0xFF8D6E63)),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
_iconButton(
|
|
icon: Icons.chevron_right,
|
|
tooltip: '下一月',
|
|
// 不允许超过当前月
|
|
onTap: notifier.canGoNext ? notifier.next : null,
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget _iconButton({
|
|
required IconData icon,
|
|
required String tooltip,
|
|
VoidCallback? onTap,
|
|
}) {
|
|
final enabled = onTap != null;
|
|
return IconButton(
|
|
icon: Icon(icon),
|
|
iconSize: 20,
|
|
visualDensity: VisualDensity.compact,
|
|
padding: EdgeInsets.zero,
|
|
constraints: const BoxConstraints(minWidth: 32, minHeight: 32),
|
|
color: enabled ? const Color(0xFF5D4037) : const Color(0xFFBCAAA4),
|
|
tooltip: tooltip,
|
|
onPressed: onTap,
|
|
);
|
|
}
|
|
|
|
Future<void> _pickMonth(BuildContext context, WidgetRef ref) async {
|
|
final anchor = ref.read(monthAnchorProvider);
|
|
final picked = await showDatePicker(
|
|
context: context,
|
|
initialDate: anchor,
|
|
initialDatePickerMode: DatePickerMode.year,
|
|
firstDate: DateTime(2000),
|
|
lastDate: DateTime(2100),
|
|
);
|
|
if (picked != null) {
|
|
ref.read(monthAnchorProvider.notifier).pick(picked);
|
|
}
|
|
}
|
|
}
|