refactor: 重构 Agent 模块为 AgentScope,删除旧版 CrewAI/LiteLLM 实现

This commit is contained in:
qzl
2026-03-11 20:51:56 +08:00
parent 177ed616bf
commit 145e3dc615
149 changed files with 5120 additions and 11356 deletions
@@ -98,8 +98,6 @@ class _CreateEventSheetState extends State<CreateEventSheet>
_endDate = now;
_endTime = now.add(const Duration(hours: 1));
}
_titleController.addListener(() => setState(() {}));
}
@override
@@ -163,18 +161,23 @@ class _CreateEventSheetState extends State<CreateEventSheet>
color: AppColors.slate900,
),
),
GestureDetector(
onTap: _saveEvent,
child: Text(
'保存',
style: TextStyle(
fontSize: 17,
fontWeight: FontWeight.w600,
color: _titleController.text.trim().isNotEmpty
? AppColors.blue600
: AppColors.slate400,
),
),
ValueListenableBuilder<TextEditingValue>(
valueListenable: _titleController,
builder: (context, value, child) {
return GestureDetector(
onTap: _saveEvent,
child: Text(
'保存',
style: TextStyle(
fontSize: 17,
fontWeight: FontWeight.w600,
color: value.text.trim().isNotEmpty
? AppColors.blue600
: AppColors.slate400,
),
),
);
},
),
],
),
@@ -233,9 +236,10 @@ class _CreateEventSheetState extends State<CreateEventSheet>
time.hour,
time.minute,
);
if (endDateTime.isBefore(startDateTime)) {
if (endDateTime.isBefore(startDateTime) ||
endDateTime.isAtSameMomentAs(startDateTime)) {
_endDate = date;
_endTime = time;
_endTime = time.add(const Duration(hours: 1));
}
}
});
@@ -261,9 +265,10 @@ class _CreateEventSheetState extends State<CreateEventSheet>
time.hour,
time.minute,
);
if (endDateTime.isBefore(startDateTime)) {
if (endDateTime.isBefore(startDateTime) ||
endDateTime.isAtSameMomentAs(startDateTime)) {
_endDate = _startDate;
_endTime = _startTime;
_endTime = _startTime.add(const Duration(hours: 1));
} else {
_endDate = date;
_endTime = time;
@@ -271,6 +276,13 @@ class _CreateEventSheetState extends State<CreateEventSheet>
});
},
isOptional: true,
minTime: DateTime(
_startDate.year,
_startDate.month,
_startDate.day,
_startTime.hour,
_startTime.minute,
),
),
],
),
@@ -620,6 +632,7 @@ class _CreateEventSheetState extends State<CreateEventSheet>
DateTime time,
Function(DateTime, DateTime) onChanged, {
bool isOptional = false,
DateTime? minTime,
}) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -635,7 +648,7 @@ class _CreateEventSheetState extends State<CreateEventSheet>
const SizedBox(height: 8),
InkWell(
onTap: () async {
final picked = await _pickDateTime(date, time);
final picked = await _pickDateTime(date, time, minTime: minTime);
if (picked == null) {
return;
}
@@ -687,14 +700,18 @@ class _CreateEventSheetState extends State<CreateEventSheet>
Future<(DateTime, DateTime)?> _pickDateTime(
DateTime date,
DateTime time,
) async {
DateTime time, {
DateTime? minTime,
}) async {
final result = await showModalBottomSheet<(DateTime, DateTime)>(
context: context,
backgroundColor: Colors.transparent,
isScrollControlled: true,
builder: (context) =>
_DateTimePickerSheet(initialDate: date, initialTime: time),
builder: (context) => _DateTimePickerSheet(
initialDate: date,
initialTime: time,
minTime: minTime,
),
);
return result;
}
@@ -845,6 +862,7 @@ class _CreateEventSheetState extends State<CreateEventSheet>
id: _isEditing
? widget.editingEvent!.id
: 'evt_${DateTime.now().millisecondsSinceEpoch}',
ownerId: widget.editingEvent?.ownerId ?? '',
title: _titleController.text.trim(),
description: _descriptionController.text.trim().isNotEmpty
? _descriptionController.text.trim()
@@ -856,7 +874,6 @@ class _CreateEventSheetState extends State<CreateEventSheet>
try {
final service = sl<CalendarService>();
final notificationService = sl<LocalNotificationService>();
late final ScheduleItemModel saved;
if (_isEditing) {
@@ -864,7 +881,11 @@ class _CreateEventSheetState extends State<CreateEventSheet>
} else {
saved = await service.addEvent(event);
}
await notificationService.upsertEventReminder(saved);
try {
final notificationService = sl<LocalNotificationService>();
await notificationService.upsertEventReminder(saved);
} catch (_) {}
widget.onSaved?.call();
if (mounted) {
@@ -889,10 +910,12 @@ class _CreateEventSheetState extends State<CreateEventSheet>
class _DateTimePickerSheet extends StatefulWidget {
final DateTime initialDate;
final DateTime initialTime;
final DateTime? minTime;
const _DateTimePickerSheet({
required this.initialDate,
required this.initialTime,
this.minTime,
});
@override
@@ -915,10 +938,49 @@ class _DateTimePickerSheetState extends State<_DateTimePickerSheet> {
static final int _baseYear = DateTime.now().year;
static final List<int> _years = List.generate(21, (i) => _baseYear - 10 + i);
static final List<int> _months = List.generate(12, (i) => i + 1);
static final List<int> _hours = List.generate(24, (i) => i);
static final List<int> _minutes = List.generate(60, (i) => i);
static final List<int> _allHours = List.generate(24, (i) => i);
static final List<int> _allMinutes = List.generate(60, (i) => i);
List<int> _days = [];
late List<int> _filteredHours;
late List<int> _filteredMinutes;
List<int> _getFilteredHours() {
if (widget.minTime == null) return _allHours;
final minDate = widget.minTime!;
if (_selectedYear > minDate.year ||
(_selectedYear == minDate.year && _selectedMonth > minDate.month) ||
(_selectedYear == minDate.year &&
_selectedMonth == minDate.month &&
_selectedDay > minDate.day)) {
return _allHours;
}
if (_selectedYear == minDate.year &&
_selectedMonth == minDate.month &&
_selectedDay == minDate.day) {
return _allHours.where((h) => h > minDate.hour).toList();
}
return _allHours;
}
List<int> _getFilteredMinutes() {
if (widget.minTime == null) return _allMinutes;
final minDate = widget.minTime!;
if (_selectedYear > minDate.year ||
(_selectedYear == minDate.year && _selectedMonth > minDate.month) ||
(_selectedYear == minDate.year &&
_selectedMonth == minDate.month &&
_selectedDay > minDate.day)) {
return _allMinutes;
}
if (_selectedYear == minDate.year &&
_selectedMonth == minDate.month &&
_selectedDay == minDate.day &&
_selectedHour == minDate.hour) {
return _allMinutes.where((m) => m > minDate.minute).toList();
}
return _allMinutes;
}
@override
void initState() {
@@ -928,6 +990,8 @@ class _DateTimePickerSheetState extends State<_DateTimePickerSheet> {
_selectedDay = widget.initialDate.day;
_selectedHour = widget.initialTime.hour;
_selectedMinute = widget.initialTime.minute;
_filteredHours = _getFilteredHours();
_filteredMinutes = _getFilteredMinutes();
_updateDays();
_yearController = FixedExtentScrollController(
@@ -937,9 +1001,11 @@ class _DateTimePickerSheetState extends State<_DateTimePickerSheet> {
initialItem: _selectedMonth - 1,
);
_dayController = FixedExtentScrollController(initialItem: _selectedDay - 1);
_hourController = FixedExtentScrollController(initialItem: _selectedHour);
_hourController = FixedExtentScrollController(
initialItem: _filteredHours.indexOf(_selectedHour),
);
_minuteController = FixedExtentScrollController(
initialItem: _selectedMinute,
initialItem: _filteredMinutes.indexOf(_selectedMinute),
);
}
@@ -1055,9 +1121,26 @@ class _DateTimePickerSheetState extends State<_DateTimePickerSheet> {
children: [
Expanded(
child: _buildPicker(
_hours,
_filteredHours,
_hourController,
(v) => setState(() => _selectedHour = v),
(v) {
setState(() {
_selectedHour = v;
_filteredMinutes = _getFilteredMinutes();
if (_selectedMinute >
_filteredMinutes.last) {
_selectedMinute =
_filteredMinutes.isNotEmpty
? _filteredMinutes.last
: 0;
_minuteController.jumpToItem(
_filteredMinutes.indexOf(
_selectedMinute,
),
);
}
});
},
(v) => v.toString().padLeft(2, '0'),
itemExtent: 50,
),
@@ -1072,7 +1155,7 @@ class _DateTimePickerSheetState extends State<_DateTimePickerSheet> {
),
Expanded(
child: _buildPicker(
_minutes,
_filteredMinutes,
_minuteController,
(v) => setState(() => _selectedMinute = v),
(v) => v.toString().padLeft(2, '0'),