chore: 添加 iOS/Android 相机和相册权限配置

This commit is contained in:
qzl
2026-03-11 17:32:00 +08:00
parent e2eff03060
commit 177ed616bf
5 changed files with 59 additions and 28 deletions
@@ -44,7 +44,6 @@ class _CalendarDayWeekScreenState extends State<CalendarDayWeekScreen>
final ScrollController _dayStripController = ScrollController();
Key _eventsKey = UniqueKey();
List<ScheduleItemModel> _events = const [];
String? _lastRoute;
@override
void initState() {
@@ -62,20 +61,17 @@ class _CalendarDayWeekScreenState extends State<CalendarDayWeekScreen>
WidgetsBinding.instance.addPostFrameCallback((_) {
_scrollToSelectedDate();
_lastRoute = GoRouterState.of(context).uri.toString();
_setupRouteListener();
});
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
final currentRoute = GoRouterState.of(context).uri.toString();
if (_lastRoute != null && _lastRoute != currentRoute) {
if (!currentRoute.contains('/events/')) {
_loadEvents();
}
}
_lastRoute = currentRoute;
void _setupRouteListener() {
final router = GoRouter.of(context);
router.routerDelegate.addListener(_onRouteChange);
}
void _onRouteChange() {
_loadEvents();
}
void _updateMonthDates() {
@@ -94,6 +90,9 @@ class _CalendarDayWeekScreenState extends State<CalendarDayWeekScreen>
@override
void dispose() {
try {
GoRouter.of(context).routerDelegate.removeListener(_onRouteChange);
} catch (_) {}
WidgetsBinding.instance.removeObserver(this);
_dayStripController.dispose();
super.dispose();
@@ -27,7 +27,6 @@ class _CalendarMonthScreenState extends State<CalendarMonthScreen>
late DateTime _selectedDate;
Key _eventsKey = UniqueKey();
final Map<String, List<ScheduleItemModel>> _eventsByDay = {};
String? _lastRoute;
@override
void initState() {
@@ -45,20 +44,17 @@ class _CalendarMonthScreenState extends State<CalendarMonthScreen>
_loadMonthEvents();
WidgetsBinding.instance.addPostFrameCallback((_) {
_lastRoute = GoRouterState.of(context).uri.toString();
_setupRouteListener();
});
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
final currentRoute = GoRouterState.of(context).uri.toString();
if (_lastRoute != null && _lastRoute != currentRoute) {
if (!currentRoute.contains('/events/')) {
_loadMonthEvents();
}
}
_lastRoute = currentRoute;
void _setupRouteListener() {
final router = GoRouter.of(context);
router.routerDelegate.addListener(_onRouteChange);
}
void _onRouteChange() {
_loadMonthEvents();
}
Future<void> _loadMonthEvents() async {
@@ -85,6 +81,9 @@ class _CalendarMonthScreenState extends State<CalendarMonthScreen>
@override
void dispose() {
try {
GoRouter.of(context).routerDelegate.removeListener(_onRouteChange);
} catch (_) {}
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@@ -113,8 +113,13 @@ class _CreateEventSheetState extends State<CreateEventSheet>
}
DateTime _roundToNearestMinute(DateTime dt, int interval) {
final minute = (dt.minute / interval).round() * interval;
return DateTime(dt.year, dt.month, dt.day, dt.hour, minute % 60);
final totalMinutes = dt.hour * 60 + dt.minute;
final rounded = ((totalMinutes / interval).round() * interval);
final hours = rounded ~/ 60;
final minutes = rounded % 60;
final dayOffset = hours >= 24 ? 1 : 0;
final newHour = hours % 24;
return DateTime(dt.year, dt.month, dt.day + dayOffset, newHour, minutes);
}
@override
@@ -242,8 +247,27 @@ class _CreateEventSheetState extends State<CreateEventSheet>
_endTime ?? _startTime,
(date, time) {
setState(() {
_endDate = date;
_endTime = time;
final startDateTime = DateTime(
_startDate.year,
_startDate.month,
_startDate.day,
_startTime.hour,
_startTime.minute,
);
final endDateTime = DateTime(
date.year,
date.month,
date.day,
time.hour,
time.minute,
);
if (endDateTime.isBefore(startDateTime)) {
_endDate = _startDate;
_endTime = _startTime;
} else {
_endDate = date;
_endTime = time;
}
});
},
isOptional: true,