- 新增 AppColors 统一配色方案(清爽紫蓝,参考蚂蚁阿福风格) - 新增 common_widgets(GradientBorderButton / CardActionButton / IconBox) - AgentWelcomeCard 美化:渐变 header + AI标签 + 核心功能区 + 快捷操作区 - DataConfirmCard 统一:三合一(健康/药品/运动),可编辑字段列表 - 删除死代码:medicationConfirm/dietAnalysis/reportAnalysis/quickOptions 卡片 - 删除死路由:doctors/profileEdit/editProfile - AI 对话去除 Markdown 符号(_stripMd),统一行间距 1.5 - 逐字淡入动画修复:key 改用 stableId 避免重复触发 - 健康概览时间修复:前端发送 UTC 避免时区歧义 - PG 数据目录迁入项目 backend/pgdata/,加入 .gitignore - 新增欧姆龙血压计实施方案文档
137 lines
3.4 KiB
Dart
137 lines
3.4 KiB
Dart
import 'package:flutter/material.dart';
|
|
import '../core/app_colors.dart';
|
|
|
|
/// 渐变边框按钮(白色底+彩色渐变边框)
|
|
class GradientBorderButton extends StatelessWidget {
|
|
final String text;
|
|
final IconData? icon;
|
|
final VoidCallback? onTap;
|
|
final double height;
|
|
final bool isSuccess;
|
|
|
|
const GradientBorderButton({
|
|
super.key,
|
|
required this.text,
|
|
this.icon,
|
|
this.onTap,
|
|
this.height = 52,
|
|
this.isSuccess = false,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Container(
|
|
height: height,
|
|
decoration: BoxDecoration(
|
|
gradient: isSuccess ? AppColors.successButtonGradient : AppColors.buttonGradient,
|
|
borderRadius: BorderRadius.circular(14),
|
|
boxShadow: AppColors.buttonShadow,
|
|
),
|
|
child: Material(
|
|
color: Colors.transparent,
|
|
child: InkWell(
|
|
onTap: onTap,
|
|
borderRadius: BorderRadius.circular(14),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
if (icon != null) ...[
|
|
Icon(icon, size: 22, color: AppColors.textOnGradient),
|
|
const SizedBox(width: 8),
|
|
],
|
|
Text(
|
|
text,
|
|
style: const TextStyle(
|
|
fontSize: 17,
|
|
fontWeight: FontWeight.w600,
|
|
color: AppColors.textOnGradient,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
/// 卡片内的小操作按钮
|
|
class CardActionButton extends StatelessWidget {
|
|
final String label;
|
|
final IconData icon;
|
|
final VoidCallback? onTap;
|
|
final Color? iconColor;
|
|
|
|
const CardActionButton({
|
|
super.key,
|
|
required this.label,
|
|
required this.icon,
|
|
this.onTap,
|
|
this.iconColor,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return InkWell(
|
|
onTap: onTap,
|
|
borderRadius: BorderRadius.circular(12),
|
|
child: Container(
|
|
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 10),
|
|
decoration: BoxDecoration(
|
|
color: AppColors.backgroundSecondary,
|
|
borderRadius: BorderRadius.circular(12),
|
|
border: Border.all(color: AppColors.borderLight),
|
|
),
|
|
child: Row(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Icon(icon, size: 18, color: iconColor ?? AppColors.iconColor),
|
|
const SizedBox(width: 6),
|
|
Text(
|
|
label,
|
|
style: TextStyle(
|
|
fontSize: 14,
|
|
fontWeight: FontWeight.w500,
|
|
color: AppColors.textPrimary,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
/// 功能区小图标容器
|
|
class IconBox extends StatelessWidget {
|
|
final IconData icon;
|
|
final double size;
|
|
final Color? backgroundColor;
|
|
final Color? iconColor;
|
|
|
|
const IconBox({
|
|
super.key,
|
|
required this.icon,
|
|
this.size = 44,
|
|
this.backgroundColor,
|
|
this.iconColor,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Container(
|
|
width: size,
|
|
height: size,
|
|
decoration: BoxDecoration(
|
|
color: backgroundColor ?? AppColors.iconBackground,
|
|
borderRadius: BorderRadius.circular(size / 3),
|
|
),
|
|
child: Icon(
|
|
icon,
|
|
size: size * 0.55,
|
|
color: iconColor ?? AppColors.iconColor,
|
|
),
|
|
);
|
|
}
|
|
}
|