fix: 健康仪表盘单位下移 + 档案按钮浅紫 + AI问诊胶囊改名 + 删除账号功能

This commit is contained in:
MingNian
2026-06-17 17:35:47 +08:00
parent 0f2a9c1c1a
commit fbaed0cf1d
11 changed files with 1289 additions and 1500 deletions

View File

@@ -2,6 +2,7 @@ import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shadcn_ui/shadcn_ui.dart';
import '../../../core/app_colors.dart';
import '../../../core/app_theme.dart';
import '../../../core/navigation_provider.dart';
@@ -294,12 +295,27 @@ class ChatMessagesView extends ConsumerWidget {
fit: BoxFit.cover,
),
// ── 医生选择区(问诊专用)──
// ── AI问诊引导 ──
if (agent == ActiveAgent.consultation) ...[
const SizedBox(height: 14),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: _buildDoctorCards(ref, agentColors),
child: Container(
width: double.infinity,
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: const Color(0xFFF0F4FF),
borderRadius: BorderRadius.circular(14),
),
child: const Text(
'在下方输入框描述您的症状AI医生将为您提供专业建议',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 14,
color: AppColors.textSecondary,
),
),
),
),
],
@@ -409,13 +425,18 @@ class ChatMessagesView extends ConsumerWidget {
mainAxisSize: MainAxisSize.min,
children: [
ShaderMask(
shaderCallback: (bounds) => AppColors.actionOutlineGradient.createShader(bounds),
shaderCallback: (bounds) =>
AppColors.actionOutlineGradient.createShader(bounds),
child: Icon(a.icon, size: 24, color: Colors.white),
),
const SizedBox(width: 10),
Text(
a.label,
style: const TextStyle(fontSize: 17, fontWeight: FontWeight.w700, color: AppColors.textPrimary),
style: const TextStyle(
fontSize: 17,
fontWeight: FontWeight.w700,
color: AppColors.textPrimary,
),
),
],
),
@@ -436,113 +457,6 @@ class ChatMessagesView extends ConsumerWidget {
};
}
Widget _buildDoctorCards(WidgetRef ref, _AgentColors colors) {
const doctors = [
{
'name': '张明',
'title': '主任医师',
'dept': '心脏康复科',
'desc': '冠心病、高血压术后管理',
'id': '468b82e2-d95a-4436-bff6-a50eecf99a66',
},
{
'name': '李芳',
'title': '副主任医师',
'dept': '营养科',
'desc': '糖尿病、甲状腺疾病管理',
'id': 'd4148733-b538-4398-af17-0c7592fc0c2d',
},
{
'name': '王建国',
'title': '主任医师',
'dept': '心血管内科',
'desc': '术后营养指导、饮食方案制定',
'id': 'ef0953c9-eb63-4d03-b6d7-050a1897d4a3',
},
];
return Row(
children: [
for (var i = 0; i < doctors.length; i++) ...[
if (i > 0) const SizedBox(width: 8),
Expanded(child: _doctorCard(doctors[i], ref, colors)),
],
],
);
}
Widget _doctorCard(
Map<String, String> doc,
WidgetRef ref,
_AgentColors colors,
) {
return InkWell(
onTap: () => pushRoute(ref, 'consultation', params: {'id': doc['id']!}),
borderRadius: BorderRadius.circular(12),
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 10),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
border: Border.all(color: colors.border),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
CircleAvatar(
radius: 22,
backgroundColor: colors.iconBg,
child: Text(
doc['name']![0],
style: TextStyle(
fontSize: 21,
fontWeight: FontWeight.w600,
color: colors.accent,
),
),
),
const SizedBox(height: 6),
Text(
doc['name']!,
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
color: AppColors.textPrimary,
),
),
Text(
doc['title']!,
style: const TextStyle(fontSize: 14, color: AppColors.textHint),
),
const SizedBox(height: 2),
Container(
padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2),
decoration: BoxDecoration(
color: colors.iconBg,
borderRadius: BorderRadius.circular(4),
),
child: Text(
doc['dept']!,
style: TextStyle(fontSize: 13, color: colors.accent),
),
),
const SizedBox(height: 4),
Text(
doc['desc']!,
style: const TextStyle(
fontSize: 13,
color: AppColors.textSecondary,
height: 1.3,
),
maxLines: 2,
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.center,
),
],
),
),
);
}
// ═══════════════════════════════════════════════════════════
// 2. DataConfirmCard — 统一确认卡片(紫白蓝风格)
// ═══════════════════════════════════════════════════════════
@@ -1556,46 +1470,52 @@ class ChatMessagesView extends ConsumerWidget {
static _AgentColors _agentColors(ActiveAgent agent) {
return switch (agent) {
ActiveAgent.consultation => _AgentColors(
gradient: [AppColors.sageAccent, AppColors.primary],
bg: const Color(0xFFF2FBF9),
border: const Color(0xFFD9F0EA),
iconBg: const Color(0xFFE8F8F4),
accent: const Color(0xFF4F9E90),
gradient: [Color(0xFFFFCAD4), Color(0xFFFF9AAE)],
bg: const Color(0xFFFFF4F6),
border: const Color(0xFFFFDFE7),
iconBg: const Color(0xFFFFEEF2),
accent: const Color(0xFFFF7F98),
verticalGradient: true,
),
ActiveAgent.health => _AgentColors(
gradient: [AppColors.meadowAccent, AppColors.auraDeepIndigo],
bg: const Color(0xFFF3FBF4),
border: const Color(0xFFDFF2E4),
iconBg: const Color(0xFFEFF9F0),
accent: const Color(0xFF4EA65B),
gradient: [Color(0xFFFFAFBD), Color(0xFFC9FFBF)],
bg: const Color(0xFFF7FDEB),
border: const Color(0xFFEAF7BF),
iconBg: const Color(0xFFF9FCEB),
accent: const Color(0xFF8BD982),
verticalGradient: true,
),
ActiveAgent.diet => _AgentColors(
gradient: [AppColors.peachAccent, AppColors.auraOrchid],
gradient: [Color(0xFFF6D365), Color(0xFFFDA085)],
bg: const Color(0xFFFFF7F0),
border: const Color(0xFFFFE8D4),
iconBg: const Color(0xFFFFF0E4),
accent: const Color(0xFFE26A64),
accent: const Color(0xFFF89C5B),
verticalGradient: true,
),
ActiveAgent.medication => _AgentColors(
gradient: [AppColors.auraLavender, AppColors.blueMeasure],
gradient: [Color(0xFF89F7FE), Color(0xFF66A6FF)],
bg: const Color(0xFFF4F6FF),
border: const Color(0xFFDDE6FF),
iconBg: const Color(0xFFEFF3FF),
accent: AppColors.primary,
accent: const Color(0xFF4F8FF7),
verticalGradient: true,
),
ActiveAgent.report => _AgentColors(
gradient: [AppColors.primary, AppColors.roseAccent],
gradient: [Color(0xFFE0C3FC), Color(0xFF8EC5FC)],
bg: const Color(0xFFF8F5FF),
border: const Color(0xFFE9E0FF),
iconBg: const Color(0xFFF2EDFF),
accent: AppColors.primary,
accent: const Color(0xFF9D8AF8),
verticalGradient: true,
),
ActiveAgent.exercise => _AgentColors(
gradient: [AppColors.sageAccent, AppColors.auraDeepIndigo],
bg: const Color(0xFFF0FBFD),
border: const Color(0xFFD6EEF2),
iconBg: const Color(0xFFE8F7FA),
accent: const Color(0xFF2B8EA0),
gradient: [Color(0xFFB6F2FF), Color(0xFF7DD3FC)],
bg: const Color(0xFFF0FCFF),
border: const Color(0xFFD8F5FC),
iconBg: const Color(0xFFEAFBFF),
accent: const Color(0xFF38BDE8),
verticalGradient: true,
),
_ => _AgentColors(
gradient: [AppColors.primary, AppColors.blueMeasure],
@@ -1609,16 +1529,16 @@ class ChatMessagesView extends ConsumerWidget {
static (_AgentIcon, String, String) _agentInfo(ActiveAgent agent) {
return switch (agent) {
ActiveAgent.health => (Icons.favorite_border, '记数据', '录入血压、血糖、心率等日常指标'),
ActiveAgent.diet => (Icons.restaurant, '拍饮食', '拍照识别食物热量和营养成分'),
ActiveAgent.medication => (Icons.medication, '药管家', '管理药品、提醒服药、追踪用量'),
ActiveAgent.health => (LucideIcons.heartPulse, '记数据', '录入血压、血糖、心率等日常指标'),
ActiveAgent.diet => (LucideIcons.utensils, '拍饮食', '拍照识别食物热量和营养成分'),
ActiveAgent.medication => (LucideIcons.pill, '药管家', '管理药品、提醒服药、追踪用量'),
ActiveAgent.consultation => (
Icons.local_hospital,
'问诊',
'在线咨询医生,描述症状获取建议',
LucideIcons.messageCircle,
'AI问诊',
'AI智能问诊,描述症状获取建议',
),
ActiveAgent.report => (Icons.assignment, '报告分析', '上传体检报告AI 辅助解读'),
ActiveAgent.exercise => (Icons.directions_run, '运动', '制定运动计划,打卡记录进度'),
ActiveAgent.report => (LucideIcons.fileText, '报告分析', '上传体检报告AI 辅助解读'),
ActiveAgent.exercise => (LucideIcons.activity, '运动', '制定运动计划,打卡记录进度'),
_ => (Icons.forum_outlined, 'AI 助手', '您的智能健康管家'),
};
}
@@ -2031,13 +1951,17 @@ class _AgentMark extends StatelessWidget {
decoration: BoxDecoration(
gradient: LinearGradient(
colors: colors.gradient,
begin: Alignment.topLeft,
end: Alignment.bottomRight,
begin: colors.verticalGradient
? Alignment.topCenter
: Alignment.topLeft,
end: colors.verticalGradient
? Alignment.bottomCenter
: Alignment.bottomRight,
),
borderRadius: BorderRadius.circular(20),
borderRadius: BorderRadius.circular(colors.verticalGradient ? 18 : 20),
boxShadow: [
BoxShadow(
color: colors.accent.withValues(alpha: 0.24),
color: colors.accent.withValues(alpha: 0.18),
blurRadius: 18,
offset: const Offset(0, 8),
),
@@ -2103,12 +2027,14 @@ class _AgentColors {
final Color border;
final Color iconBg;
final Color accent;
final bool verticalGradient;
const _AgentColors({
required this.gradient,
required this.bg,
required this.border,
required this.iconBg,
required this.accent,
this.verticalGradient = false,
});
}