feat: AI Agent 处理器扩展 + 服药打卡确认链路 + AI 气泡配色微调 + 数据刷新 providers 抽离 + 多端页面细节调整

This commit is contained in:
MingNian
2026-07-20 17:12:00 +08:00
parent 9cea41705e
commit 0cb5b8e85a
45 changed files with 1435 additions and 276 deletions

View File

@@ -9,6 +9,7 @@ import '../core/app_theme.dart';
import '../core/navigation_provider.dart';
import '../providers/auth_provider.dart';
import '../providers/data_providers.dart';
import '../providers/data_refresh_providers.dart';
import '../widgets/common_widgets.dart';
import '../widgets/app_empty_state.dart';
import '../widgets/app_error_state.dart';
@@ -64,7 +65,7 @@ class _DietRecordListPageState extends ConsumerState<DietRecordListPage> {
setState(() => _data.removeAt(index));
try {
await ref.read(dietServiceProvider).deleteRecord(id);
ref.invalidate(dietRecordsProvider);
ref.read(dietDataRefreshSignalProvider.notifier).trigger();
if (mounted) {
AppToast.show(context, '已删除', type: AppToastType.success);
}
@@ -100,6 +101,9 @@ class _DietRecordListPageState extends ConsumerState<DietRecordListPage> {
@override
Widget build(BuildContext context) {
ref.listen(dietDataRefreshSignalProvider, (previous, next) {
if (previous != null && previous != next) _refresh();
});
if (_loading) {
return GradientScaffold(
appBar: AppBar(
@@ -451,7 +455,9 @@ class _DietRecordListPageState extends ConsumerState<DietRecordListPage> {
});
if (!ctx.mounted) return;
Navigator.pop(ctx);
await _refresh();
ref
.read(dietDataRefreshSignalProvider.notifier)
.trigger();
} catch (_) {
if (!ctx.mounted) return;
setDialogState(() => saving = false);
@@ -1047,7 +1053,7 @@ class _ExercisePlanPageState extends ConsumerState<ExercisePlanPage> {
setState(() => _busyItems.add(itemId));
try {
await ref.read(exerciseServiceProvider).checkIn(itemId);
ref.invalidate(currentExercisePlanProvider);
ref.read(exerciseDataRefreshSignalProvider.notifier).trigger();
_load();
} catch (e) {
debugPrint('[ExercisePlan] 打卡失败: $e');
@@ -1061,7 +1067,7 @@ class _ExercisePlanPageState extends ConsumerState<ExercisePlanPage> {
Future<void> _deletePlan(String id) async {
await ref.read(exerciseServiceProvider).deletePlan(id);
ref.invalidate(currentExercisePlanProvider);
ref.read(exerciseDataRefreshSignalProvider.notifier).trigger();
_load();
}
@@ -1657,7 +1663,7 @@ class _ExercisePlanDetailPageState
setState(() => _busyItems.add(itemId));
try {
await ref.read(exerciseServiceProvider).checkIn(itemId);
ref.invalidate(currentExercisePlanProvider);
ref.read(exerciseDataRefreshSignalProvider.notifier).trigger();
_load();
} catch (e) {
debugPrint('[ExercisePlanDetail] 打卡失败: $e');
@@ -2182,7 +2188,7 @@ class _ExercisePlanCreatePageState
'reminderTime':
'${_reminderTime.hour.toString().padLeft(2, '0')}:${_reminderTime.minute.toString().padLeft(2, '0')}',
});
ref.invalidate(currentExercisePlanProvider);
ref.read(exerciseDataRefreshSignalProvider.notifier).trigger();
if (mounted) {
popRoute(ref);
}
@@ -3805,8 +3811,19 @@ class _HealthCalendarPageState extends ConsumerState<HealthCalendarPage> {
_loadMonth();
}
void _refreshScheduleData() {
_dayCache.clear();
_loadMonth();
}
@override
Widget build(BuildContext context) {
ref.listen(exerciseDataRefreshSignalProvider, (previous, next) {
if (previous != null && previous != next) _refreshScheduleData();
});
ref.listen(medicationDataRefreshSignalProvider, (previous, next) {
if (previous != null && previous != next) _refreshScheduleData();
});
return GradientScaffold(
appBar: AppBar(
backgroundColor: Colors.white,