feat: 增强日历功能并集成 AgentScope 代理服务
This commit is contained in:
@@ -35,6 +35,7 @@ class _CalendarDayWeekScreenState extends State<CalendarDayWeekScreen> {
|
||||
late List<DateTime> _monthDates;
|
||||
final ScrollController _dayStripController = ScrollController();
|
||||
Key _eventsKey = UniqueKey();
|
||||
List<ScheduleItemModel> _events = const [];
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@@ -47,6 +48,7 @@ class _CalendarDayWeekScreenState extends State<CalendarDayWeekScreen> {
|
||||
|
||||
_selectedDate = _calendarManager.selectedDate;
|
||||
_updateMonthDates();
|
||||
_loadEvents();
|
||||
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
_scrollToSelectedDate();
|
||||
@@ -57,6 +59,16 @@ class _CalendarDayWeekScreenState extends State<CalendarDayWeekScreen> {
|
||||
_monthDates = monthDatesFor(_selectedDate);
|
||||
}
|
||||
|
||||
Future<void> _loadEvents() async {
|
||||
final events = await sl<CalendarService>().getEventsForDay(_selectedDate);
|
||||
if (!mounted) {
|
||||
return;
|
||||
}
|
||||
setState(() {
|
||||
_events = events;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_dayStripController.dispose();
|
||||
@@ -147,6 +159,7 @@ class _CalendarDayWeekScreenState extends State<CalendarDayWeekScreen> {
|
||||
setState(() {
|
||||
_eventsKey = UniqueKey();
|
||||
});
|
||||
_loadEvents();
|
||||
},
|
||||
),
|
||||
child: Container(
|
||||
@@ -191,6 +204,7 @@ class _CalendarDayWeekScreenState extends State<CalendarDayWeekScreen> {
|
||||
_calendarManager.setSelectedDate(date);
|
||||
_updateMonthDates();
|
||||
_scrollToSelectedDate(animate: true);
|
||||
_loadEvents();
|
||||
},
|
||||
child: SizedBox(
|
||||
width: _dayItemWidth,
|
||||
@@ -267,7 +281,7 @@ class _CalendarDayWeekScreenState extends State<CalendarDayWeekScreen> {
|
||||
Widget _buildTimelineBoard() {
|
||||
final now = DateTime.now();
|
||||
final showCurrent = shouldShowCurrentMarker(_selectedDate, now);
|
||||
final events = CalendarService().getEventsForDay(_selectedDate);
|
||||
final events = _events;
|
||||
|
||||
final eventColumns = _calculateEventColumns(events);
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:lucide_icons/lucide_icons.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import '../../../../core/di/injection.dart';
|
||||
import '../../../../core/theme/design_tokens.dart';
|
||||
import '../../data/services/mock_calendar_service.dart';
|
||||
import '../../data/models/schedule_item_model.dart';
|
||||
@@ -18,6 +19,7 @@ class CalendarEventDetailScreen extends StatefulWidget {
|
||||
|
||||
class _CalendarEventDetailScreenState extends State<CalendarEventDetailScreen> {
|
||||
ScheduleItemModel? _event;
|
||||
bool _loading = true;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@@ -25,17 +27,26 @@ class _CalendarEventDetailScreenState extends State<CalendarEventDetailScreen> {
|
||||
_loadEvent();
|
||||
}
|
||||
|
||||
void _loadEvent() {
|
||||
Future<void> _loadEvent() async {
|
||||
try {
|
||||
_event = CalendarService().getEventById(widget.eventId);
|
||||
_event = await sl<CalendarService>().getEventById(widget.eventId);
|
||||
} catch (e) {
|
||||
_event = null;
|
||||
} finally {
|
||||
_loading = false;
|
||||
}
|
||||
if (mounted) {
|
||||
setState(() {});
|
||||
}
|
||||
setState(() {});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (_loading) {
|
||||
return const Scaffold(
|
||||
body: SafeArea(child: Center(child: CircularProgressIndicator())),
|
||||
);
|
||||
}
|
||||
if (_event == null) {
|
||||
return Scaffold(
|
||||
backgroundColor: const Color(0xFFF8FAFC),
|
||||
@@ -165,6 +176,8 @@ class _CalendarEventDetailScreenState extends State<CalendarEventDetailScreen> {
|
||||
if (event.metadata?.notes != null) ...[
|
||||
_buildNotesField(event.metadata!.notes!),
|
||||
],
|
||||
const SizedBox(height: 14),
|
||||
_buildMetadataSection(event.metadata),
|
||||
],
|
||||
),
|
||||
),
|
||||
@@ -275,8 +288,11 @@ class _CalendarEventDetailScreenState extends State<CalendarEventDetailScreen> {
|
||||
child: const Text('取消'),
|
||||
),
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
CalendarService().deleteEvent(widget.eventId);
|
||||
onPressed: () async {
|
||||
await sl<CalendarService>().deleteEvent(widget.eventId);
|
||||
if (!context.mounted) {
|
||||
return;
|
||||
}
|
||||
Navigator.pop(context);
|
||||
context.pop();
|
||||
},
|
||||
@@ -369,6 +385,40 @@ class _CalendarEventDetailScreenState extends State<CalendarEventDetailScreen> {
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildMetadataSection(ScheduleMetadata? metadata) {
|
||||
final raw = metadata?.raw ?? const <String, dynamic>{};
|
||||
if (raw.isEmpty) {
|
||||
return _buildDetailField('metadata', '无');
|
||||
}
|
||||
final rows = <String>[];
|
||||
raw.forEach((key, value) {
|
||||
rows.add('$key: $value');
|
||||
});
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
const Text(
|
||||
'metadata',
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: AppColors.slate400,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 6),
|
||||
...rows.map(
|
||||
(row) => Padding(
|
||||
padding: const EdgeInsets.only(bottom: 4),
|
||||
child: Text(
|
||||
row,
|
||||
style: const TextStyle(fontSize: 13, color: AppColors.slate700),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Color _parseColor(String? hex) {
|
||||
if (hex == null || hex.isEmpty) return AppColors.blue600;
|
||||
try {
|
||||
|
||||
@@ -8,6 +8,7 @@ import '../calendar_state_manager.dart';
|
||||
import '../calendar_time_utils.dart';
|
||||
import '../widgets/bottom_dock.dart';
|
||||
import '../widgets/create_event_sheet.dart';
|
||||
import '../../data/models/schedule_item_model.dart';
|
||||
import '../../data/services/mock_calendar_service.dart';
|
||||
|
||||
class CalendarMonthScreen extends StatefulWidget {
|
||||
@@ -24,6 +25,7 @@ class _CalendarMonthScreenState extends State<CalendarMonthScreen> {
|
||||
late DateTime _currentMonth;
|
||||
late DateTime _selectedDate;
|
||||
Key _eventsKey = UniqueKey();
|
||||
final Map<String, List<ScheduleItemModel>> _eventsByDay = {};
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@@ -37,6 +39,29 @@ class _CalendarMonthScreenState extends State<CalendarMonthScreen> {
|
||||
final savedDate = _calendarManager.selectedDate;
|
||||
_selectedDate = savedDate;
|
||||
_currentMonth = DateTime(savedDate.year, savedDate.month, 1);
|
||||
_loadMonthEvents();
|
||||
}
|
||||
|
||||
Future<void> _loadMonthEvents() async {
|
||||
final start = DateTime(_currentMonth.year, _currentMonth.month, 1);
|
||||
final end = DateTime(
|
||||
_currentMonth.year,
|
||||
_currentMonth.month + 1,
|
||||
0,
|
||||
23,
|
||||
59,
|
||||
59,
|
||||
);
|
||||
final events = await sl<CalendarService>().getEventsForRange(start, end);
|
||||
if (!mounted) {
|
||||
return;
|
||||
}
|
||||
_eventsByDay.clear();
|
||||
for (final event in events) {
|
||||
final key = formatYmd(event.startAt);
|
||||
_eventsByDay[key] = [...(_eventsByDay[key] ?? const []), event];
|
||||
}
|
||||
setState(() {});
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -102,6 +127,7 @@ class _CalendarMonthScreenState extends State<CalendarMonthScreen> {
|
||||
setState(() {
|
||||
_eventsKey = UniqueKey();
|
||||
});
|
||||
_loadMonthEvents();
|
||||
},
|
||||
),
|
||||
child: Container(
|
||||
@@ -280,7 +306,7 @@ class _CalendarMonthScreenState extends State<CalendarMonthScreen> {
|
||||
}
|
||||
|
||||
final date = weekFirstDate.add(Duration(days: index));
|
||||
final events = CalendarService().getEventsForDay(date);
|
||||
final events = _eventsByDay[formatYmd(date)] ?? const [];
|
||||
final displayEvents = events.take(2).toList();
|
||||
final remainingCount = events.length - 2;
|
||||
|
||||
@@ -391,6 +417,7 @@ class _CalendarMonthScreenState extends State<CalendarMonthScreen> {
|
||||
1,
|
||||
);
|
||||
});
|
||||
_loadMonthEvents();
|
||||
},
|
||||
children: List.generate(20, (index) {
|
||||
return Center(child: Text('${2020 + index}年'));
|
||||
@@ -411,6 +438,7 @@ class _CalendarMonthScreenState extends State<CalendarMonthScreen> {
|
||||
1,
|
||||
);
|
||||
});
|
||||
_loadMonthEvents();
|
||||
},
|
||||
children: List.generate(12, (index) {
|
||||
return Center(child: Text('${index + 1}月'));
|
||||
|
||||
Reference in New Issue
Block a user