fix: 欢迎卡片UI优化 + 蓝牙录入按钮 + 多处修复

- 欢迎卡片:去掉白框圆角错位、图片满宽、按钮去箭头改圆角居中
- 渐变actionOutlineGradient改紫蓝双色循环
- 新增健康Agent"蓝牙录入"按钮→蓝牙设备页
- "查看健康情况"改名"健康概览"
- 饮食编辑框删除bug修复(控制器缓存)
- 启动脚本加adb reverse自动转发
- 登录闪屏修复
This commit is contained in:
MingNian
2026-06-17 10:58:59 +08:00
parent 9279b7e283
commit 4f1ad82345
28 changed files with 1641 additions and 1098 deletions

View File

@@ -15,7 +15,7 @@ class AdminDrawer extends ConsumerWidget {
return Drawer(
width: MediaQuery.of(context).size.width * 0.8,
child: Container(
color: AppColors.background,
decoration: const BoxDecoration(gradient: AppColors.drawerGradient),
child: SafeArea(
child: Column(
children: [
@@ -23,10 +23,10 @@ class AdminDrawer extends ConsumerWidget {
margin: const EdgeInsets.all(14),
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
gradient: AppColors.softGlassGradient,
borderRadius: BorderRadius.circular(20),
border: Border.all(color: AppColors.border),
boxShadow: AppColors.cardShadowLight,
border: Border.all(color: AppColors.borderLight),
boxShadow: AppColors.cardShadow,
),
child: Row(
children: [
@@ -36,6 +36,7 @@ class AdminDrawer extends ConsumerWidget {
decoration: BoxDecoration(
gradient: AppColors.primaryGradient,
borderRadius: BorderRadius.circular(18),
boxShadow: AppColors.buttonShadow,
),
child: const Icon(
Icons.admin_panel_settings,
@@ -135,7 +136,7 @@ class _MenuItem extends StatelessWidget {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 4),
child: Material(
color: selected ? AppColors.primarySoft : Colors.white,
color: Colors.transparent,
borderRadius: BorderRadius.circular(14),
child: InkWell(
borderRadius: BorderRadius.circular(14),
@@ -143,14 +144,22 @@ class _MenuItem extends StatelessWidget {
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 12),
decoration: BoxDecoration(
gradient: selected
? AppColors.primaryGradient
: AppColors.surfaceGradient,
borderRadius: BorderRadius.circular(14),
border: Border.all(
color: selected ? AppColors.primaryLight : AppColors.border,
color: selected
? AppColors.primaryLight
: AppColors.borderLight,
),
boxShadow: selected
? AppColors.buttonShadow
: AppColors.cardShadowLight,
),
child: Row(
children: [
Icon(icon, color: color, size: 20),
Icon(icon, color: selected ? Colors.white : color, size: 20),
const SizedBox(width: 12),
Expanded(
child: Text(
@@ -158,7 +167,7 @@ class _MenuItem extends StatelessWidget {
style: TextStyle(
fontSize: 15,
fontWeight: FontWeight.w700,
color: color,
color: selected ? Colors.white : color,
),
),
),

View File

@@ -34,9 +34,10 @@ class AppCard extends StatelessWidget {
),
padding: padding,
decoration: BoxDecoration(
color: backgroundColor ?? AppColors.cardBackground,
gradient: backgroundColor == null ? AppColors.surfaceGradient : null,
color: backgroundColor,
borderRadius: radius,
border: border ?? Border.all(color: AppColors.border),
border: border ?? Border.all(color: AppColors.borderLight),
boxShadow: AppColors.cardShadowLight,
),
child: child,

View File

@@ -27,11 +27,12 @@ class AppEmptyState extends StatelessWidget {
width: 80,
height: 80,
decoration: BoxDecoration(
color: AppColors.iconBg,
gradient: AppColors.softGlassGradient,
borderRadius: BorderRadius.circular(40),
border: Border.all(color: AppColors.border),
border: Border.all(color: AppColors.borderLight),
boxShadow: AppColors.cardShadowLight,
),
child: Icon(icon, size: 34, color: AppColors.primary),
child: Icon(icon, size: 34, color: AppColors.primaryDark),
),
const SizedBox(height: 18),
Text(

View File

@@ -24,11 +24,11 @@ class AppMenuItem extends StatelessWidget {
behavior: HitTestBehavior.opaque,
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 20, vertical: 5),
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 13),
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 12),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
border: Border.all(color: AppColors.border),
gradient: AppColors.surfaceGradient,
borderRadius: BorderRadius.circular(14),
border: Border.all(color: AppColors.borderLight),
boxShadow: AppColors.cardShadowLight,
),
child: Row(
@@ -37,10 +37,14 @@ class AppMenuItem extends StatelessWidget {
width: 40,
height: 40,
decoration: BoxDecoration(
color: AppColors.iconBg,
borderRadius: BorderRadius.circular(12),
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [AppColors.primaryLight, AppColors.infoLight],
),
borderRadius: BorderRadius.circular(13),
),
child: Icon(icon, size: 21, color: AppColors.primary),
child: Icon(icon, size: 20, color: AppColors.primaryDark),
),
const SizedBox(width: 14),
Expanded(

View File

@@ -23,10 +23,13 @@ class AppTabChip extends StatelessWidget {
margin: const EdgeInsets.only(right: AppTheme.sSm),
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 9),
decoration: BoxDecoration(
color: selected ? AppColors.primary : Colors.white,
gradient: selected
? AppColors.primaryGradient
: AppColors.surfaceGradient,
color: selected ? null : Colors.white,
borderRadius: BorderRadius.circular(AppTheme.rPill),
border: Border.all(
color: selected ? AppColors.primary : AppColors.border,
color: selected ? AppColors.primaryLight : AppColors.borderLight,
),
boxShadow: selected
? AppColors.buttonShadow

View File

@@ -23,7 +23,9 @@ class GradientBorderButton extends StatelessWidget {
return Container(
height: height,
decoration: BoxDecoration(
gradient: isSuccess ? AppColors.primaryGradient : AppColors.primaryGradient,
gradient: isSuccess
? AppColors.calmHealthGradient
: AppColors.primaryGradient,
borderRadius: BorderRadius.circular(14),
boxShadow: AppColors.buttonShadow,
),
@@ -78,9 +80,10 @@ class CardActionButton extends StatelessWidget {
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 10),
decoration: BoxDecoration(
color: AppColors.cardInner,
gradient: AppColors.surfaceGradient,
borderRadius: BorderRadius.circular(12),
border: Border.all(color: AppColors.borderLight),
boxShadow: AppColors.cardShadowLight,
),
child: Row(
mainAxisSize: MainAxisSize.min,
@@ -109,11 +112,19 @@ class SwipeDeleteTile extends StatefulWidget {
final VoidCallback onDelete;
final VoidCallback? onTap;
final EdgeInsetsGeometry margin;
const SwipeDeleteTile({super.key, required this.child, required this.onDelete, this.onTap, this.margin = const EdgeInsets.symmetric(horizontal: 16, vertical: 4)});
@override State<SwipeDeleteTile> createState() => _SwipeDeleteTileState();
const SwipeDeleteTile({
super.key,
required this.child,
required this.onDelete,
this.onTap,
this.margin = const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
});
@override
State<SwipeDeleteTile> createState() => _SwipeDeleteTileState();
}
class _SwipeDeleteTileState extends State<SwipeDeleteTile> with SingleTickerProviderStateMixin {
class _SwipeDeleteTileState extends State<SwipeDeleteTile>
with SingleTickerProviderStateMixin {
double _dx = 0;
static const _maxSlide = 80.0;
static const _threshold = 24.0; // 30% of 80
@@ -130,31 +141,53 @@ class _SwipeDeleteTileState extends State<SwipeDeleteTile> with SingleTickerProv
}
}
@override Widget build(BuildContext context) {
@override
Widget build(BuildContext context) {
final isSwiped = _dx < 0;
return Padding(
padding: widget.margin,
child: Stack(children: [
Positioned.fill(child: Container(
decoration: BoxDecoration(color: AppColors.error, borderRadius: BorderRadius.circular(16)),
child: const Align(
alignment: Alignment.centerRight,
child: Padding(padding: EdgeInsets.only(right: 20), child: Icon(Icons.delete_outline, color: AppColors.textOnGradient, size: 28)),
child: Stack(
children: [
Positioned.fill(
child: Container(
decoration: BoxDecoration(
color: AppColors.error,
borderRadius: BorderRadius.circular(16),
),
child: const Align(
alignment: Alignment.centerRight,
child: Padding(
padding: EdgeInsets.only(right: 20),
child: Icon(
Icons.delete_outline,
color: AppColors.textOnGradient,
size: 28,
),
),
),
),
),
)),
GestureDetector(
behavior: isSwiped ? HitTestBehavior.opaque : HitTestBehavior.deferToChild,
onTap: isSwiped ? () { widget.onDelete(); setState(() => _dx = 0); } : widget.onTap,
onHorizontalDragUpdate: _onDragUpdate,
onHorizontalDragEnd: _onDragEnd,
child: Transform.translate(
offset: Offset(_dx, 0),
child: isSwiped
? AbsorbPointer(absorbing: true, child: widget.child)
: widget.child,
GestureDetector(
behavior: isSwiped
? HitTestBehavior.opaque
: HitTestBehavior.deferToChild,
onTap: isSwiped
? () {
widget.onDelete();
setState(() => _dx = 0);
}
: widget.onTap,
onHorizontalDragUpdate: _onDragUpdate,
onHorizontalDragEnd: _onDragEnd,
child: Transform.translate(
offset: Offset(_dx, 0),
child: isSwiped
? AbsorbPointer(absorbing: true, child: widget.child)
: widget.child,
),
),
),
]),
],
),
);
}
}
@@ -180,14 +213,12 @@ class IconBox extends StatelessWidget {
width: size,
height: size,
decoration: BoxDecoration(
color: backgroundColor ?? AppColors.iconBg,
gradient: backgroundColor == null ? AppColors.calmHealthGradient : null,
color: backgroundColor,
borderRadius: BorderRadius.circular(size / 3),
boxShadow: AppColors.cardShadowLight,
),
child: Icon(
icon,
size: size * 0.55,
color: iconColor ?? AppColors.primary,
),
child: Icon(icon, size: size * 0.55, color: iconColor ?? Colors.white),
);
}
}

View File

@@ -17,7 +17,7 @@ class DoctorDrawer extends ConsumerWidget {
return Drawer(
width: MediaQuery.of(context).size.width * 0.8,
child: Container(
color: AppColors.background,
decoration: const BoxDecoration(gradient: AppColors.drawerGradient),
child: SafeArea(
child: Column(
children: [
@@ -126,10 +126,10 @@ class _DrawerHeader extends StatelessWidget {
margin: const EdgeInsets.all(14),
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
gradient: AppColors.softGlassGradient,
borderRadius: BorderRadius.circular(20),
border: Border.all(color: AppColors.border),
boxShadow: AppColors.cardShadowLight,
border: Border.all(color: AppColors.borderLight),
boxShadow: AppColors.cardShadow,
),
child: InkWell(
onTap: onTap,
@@ -142,6 +142,7 @@ class _DrawerHeader extends StatelessWidget {
decoration: BoxDecoration(
gradient: AppColors.doctorGradient,
borderRadius: BorderRadius.circular(18),
boxShadow: AppColors.buttonShadow,
),
child: Icon(icon, color: Colors.white, size: 26),
),
@@ -202,7 +203,7 @@ class _DrawerItem extends StatelessWidget {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 4),
child: Material(
color: selected ? AppColors.primarySoft : Colors.white,
color: Colors.transparent,
borderRadius: BorderRadius.circular(14),
child: InkWell(
borderRadius: BorderRadius.circular(14),
@@ -210,14 +211,22 @@ class _DrawerItem extends StatelessWidget {
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 12),
decoration: BoxDecoration(
gradient: selected
? AppColors.primaryGradient
: AppColors.surfaceGradient,
borderRadius: BorderRadius.circular(14),
border: Border.all(
color: selected ? AppColors.primaryLight : AppColors.border,
color: selected
? AppColors.primaryLight
: AppColors.borderLight,
),
boxShadow: selected
? AppColors.buttonShadow
: AppColors.cardShadowLight,
),
child: Row(
children: [
Icon(icon, size: 20, color: color),
Icon(icon, size: 20, color: selected ? Colors.white : color),
const SizedBox(width: 12),
Expanded(
child: Text(
@@ -225,7 +234,7 @@ class _DrawerItem extends StatelessWidget {
style: TextStyle(
fontSize: 15,
fontWeight: FontWeight.w700,
color: color,
color: selected ? Colors.white : color,
),
),
),

File diff suppressed because it is too large Load Diff