chore: 添加 iOS/Android 相机和相册权限配置
This commit is contained in:
@@ -1,6 +1,11 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
|
||||
<uses-feature android:name="android.hardware.camera" android:required="false" />
|
||||
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
|
||||
|
||||
<application
|
||||
android:usesCleartextTraffic="true"
|
||||
|
||||
@@ -45,5 +45,9 @@
|
||||
<true/>
|
||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||
<true/>
|
||||
<key>NSCameraUsageDescription</key>
|
||||
<string>需要使用相机来拍摄照片</string>
|
||||
<key>NSPhotoLibraryUsageDescription</key>
|
||||
<string>需要访问相册来选择照片</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user