fix: 图片发送/医生加载/运动超时/用药黑屏/服药打卡

- sendImage: 本地预览→上传→远程URL替换
- doctorListProvider: 8s超时+mock医生fallback
- currentExercisePlanProvider: 8s超时→显示空状态
- 用药编辑: try-catch防黑屏+刷新列表
- 服药打卡: 接入后端confirm()接口
This commit is contained in:
MingNian
2026-06-03 20:03:17 +08:00
parent 95bf5732f6
commit e3b9716f7c
11 changed files with 916 additions and 393 deletions

View File

@@ -17,6 +17,7 @@ class HealthDrawer extends ConsumerWidget {
final conversations = ref.watch(conversationListProvider);
return Drawer(
width: MediaQuery.of(context).size.width * 0.8,
child: SafeArea(
child: ListView(
padding: EdgeInsets.zero,
@@ -42,9 +43,6 @@ class HealthDrawer extends ConsumerWidget {
],
),
),
_DrawerItem(icon: Icons.settings, label: '设置', onTap: () => pushRoute(ref, 'settings')),
const Divider(),
// 健康概览——接真实数据
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 8),
@@ -61,6 +59,7 @@ class HealthDrawer extends ConsumerWidget {
_HealthMetricChip(icon: Icons.monitor_heart, label: '心率', value: _metricText(data['HeartRate'], ''), onTap: () => pushRoute(ref, 'trend', params: {'type': 'heart_rate'})),
_HealthMetricChip(icon: Icons.bloodtype, label: '血糖', value: _metricText(data['Glucose'], ''), onTap: () => pushRoute(ref, 'trend', params: {'type': 'glucose'})),
_HealthMetricChip(icon: Icons.air, label: '血氧', value: _metricText(data['SpO2'], '%'), onTap: () => pushRoute(ref, 'trend', params: {'type': 'spo2'})),
_HealthMetricChip(icon: Icons.monitor_weight, label: '体重', value: _metricText(data['Weight'], 'kg'), onTap: () => pushRoute(ref, 'trend', params: {'type': 'weight'})),
],
),
),
@@ -75,6 +74,7 @@ class HealthDrawer extends ConsumerWidget {
const _HealthMetricChip(icon: Icons.monitor_heart, label: '心率', value: '--'),
const _HealthMetricChip(icon: Icons.bloodtype, label: '血糖', value: '--'),
const _HealthMetricChip(icon: Icons.air, label: '血氧', value: '--'),
const _HealthMetricChip(icon: Icons.monitor_weight, label: '体重', value: '--'),
],
),
),
@@ -116,12 +116,7 @@ class HealthDrawer extends ConsumerWidget {
),
const Divider(),
_DrawerItem(icon: Icons.logout, label: '退出登录', onTap: () async {
final ok = await showDialog<bool>(context: context, builder: (ctx) => AlertDialog(
title: const Text('退出登录'), content: const Text('确定退出?'),
actions: [TextButton(onPressed: () => Navigator.pop(ctx, false), child: const Text('取消')), TextButton(onPressed: () => Navigator.pop(ctx, true), child: const Text('确定'))]));
if (ok == true) { await ref.read(authProvider.notifier).logout(); goRoute(ref, 'login'); }
}),
_DrawerItem(icon: Icons.settings, label: '设置', onTap: () => pushRoute(ref, 'settings')),
],
),
),
@@ -189,22 +184,22 @@ class _ConversationItem extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
return Container(
margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 2),
margin: const EdgeInsets.symmetric(horizontal: 4, vertical: 2),
decoration: BoxDecoration(
color: const Color(0xFFF8F7FF),
borderRadius: BorderRadius.circular(10),
),
child: ListTile(
leading: Container(
width: 32,
height: 32,
width: 28,
height: 28,
decoration: BoxDecoration(
color: const Color(0xFFEDEBFF),
borderRadius: BorderRadius.circular(8),
),
child: Icon(_getAgentIcon(item.agent), size: 16, color: const Color(0xFF635BFF)),
child: Icon(_getAgentIcon(item.agent), size: 14, color: const Color(0xFF635BFF)),
),
title: Text(item.title, maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle(fontSize: 13, fontWeight: FontWeight.w500)),
title: Text(item.title, maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle(fontSize: 12, fontWeight: FontWeight.w500)),
subtitle: Text(item.lastMessage, maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle(fontSize: 10, color: Colors.grey[500])),
trailing: Column(
mainAxisAlignment: MainAxisAlignment.center,
@@ -212,7 +207,7 @@ class _ConversationItem extends ConsumerWidget {
children: [
Text(_formatTime(item.updatedAt), style: const TextStyle(fontSize: 9, color: Color(0xFFCCCCCC))),
PopupMenuButton<int>(
icon: const Icon(Icons.more_vert, size: 14, color: Color(0xFFCCCCCC)),
icon: const Icon(Icons.more_vert, size: 12, color: Color(0xFFCCCCCC)),
itemBuilder: (_) => [
const PopupMenuItem(value: 1, child: Text('继续聊')),
const PopupMenuItem(value: 2, child: Text('删除')),