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

@@ -5,10 +5,27 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'auth_provider.dart';
import 'conversation_history_provider.dart';
import 'data_providers.dart';
import 'data_refresh_providers.dart';
import '../utils/sse_handler.dart';
enum MessageType { text, dataConfirm, agentWelcome, taskCard }
List<ChatMessage> prependTodayHealthCard(
List<ChatMessage> messages, {
DateTime? now,
}) {
return [
ChatMessage(
id: 'task_card',
role: 'assistant',
content: '',
createdAt: now ?? DateTime.now(),
type: MessageType.taskCard,
),
...messages,
];
}
class ChatMessage {
final String id;
final String role;
@@ -133,10 +150,9 @@ class ChatNotifier extends Notifier<ChatState> {
msgs[i].confirmed = true;
state = state.copyWith(messages: msgs);
ref.invalidate(medicationListProvider);
ref.invalidate(medicationReminderProvider);
ref.read(medicationDataRefreshSignalProvider.notifier).trigger();
ref.invalidate(latestHealthProvider);
ref.invalidate(currentExercisePlanProvider);
ref.read(exerciseDataRefreshSignalProvider.notifier).trigger();
return null;
}
@@ -161,18 +177,7 @@ class ChatNotifier extends Notifier<ChatState> {
void insertTaskCard() {
if (state.messages.any((m) => m.type == MessageType.taskCard)) return;
state = state.copyWith(
messages: [
ChatMessage(
id: 'task_card',
role: 'assistant',
content: '',
createdAt: DateTime.now(),
type: MessageType.taskCard,
),
...state.messages,
],
);
state = state.copyWith(messages: prependTodayHealthCard(state.messages));
}
Future<String?> loadConversation(String convId) async {
@@ -212,7 +217,7 @@ class ChatNotifier extends Notifier<ChatState> {
}).toList();
state = ChatState(
messages: messages,
messages: prependTodayHealthCard(messages),
conversationId: convId,
activeAgent: ActiveAgent.default_,
isViewingHistory: true,