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

@@ -5,6 +5,7 @@ import 'package:image_picker/image_picker.dart';
import 'package:file_picker/file_picker.dart';
import 'package:shadcn_ui/shadcn_ui.dart';
import '../../core/app_colors.dart';
import '../../core/app_theme.dart';
import '../../core/navigation_provider.dart';
import '../../providers/auth_provider.dart';
import '../../providers/chat_provider.dart';
@@ -85,21 +86,19 @@ class _HomePageState extends ConsumerState<HomePage> {
return Scaffold(
drawer: const HealthDrawer(),
body: Container(
decoration: const BoxDecoration(gradient: AppColors.bgGradient),
child: SafeArea(
child: Column(
children: [
_buildHeader(user),
Expanded(
child: ChatMessagesView(
scrollCtrl: _scrollCtrl,
messages: chatState.messages,
),
body: AppBackground(
safeArea: true,
child: Column(
children: [
_buildHeader(user),
Expanded(
child: ChatMessagesView(
scrollCtrl: _scrollCtrl,
messages: chatState.messages,
),
_buildBottomBar(context),
],
),
),
_buildBottomBar(context),
],
),
),
);
@@ -110,10 +109,19 @@ class _HomePageState extends ConsumerState<HomePage> {
? user.name
: '用户';
return Container(
padding: const EdgeInsets.fromLTRB(14, 10, 14, 8),
padding: const EdgeInsets.fromLTRB(14, 10, 14, 10),
decoration: BoxDecoration(
color: Colors.white.withValues(alpha: 0.72),
border: const Border(bottom: BorderSide(color: AppColors.divider)),
color: Colors.white.withValues(alpha: 0.34),
border: Border(
bottom: BorderSide(color: Colors.white.withValues(alpha: 0.62)),
),
boxShadow: [
BoxShadow(
color: const Color(0xFF101828).withValues(alpha: 0.025),
blurRadius: 16,
offset: const Offset(0, 6),
),
],
),
child: Row(
children: [
@@ -178,7 +186,7 @@ class _HomePageState extends ConsumerState<HomePage> {
Widget _buildAgentBar() {
return SizedBox(
height: 42,
height: 46,
child: ListView.separated(
scrollDirection: Axis.horizontal,
padding: const EdgeInsets.symmetric(horizontal: 14),
@@ -186,21 +194,36 @@ class _HomePageState extends ConsumerState<HomePage> {
separatorBuilder: (_, _) => const SizedBox(width: 8),
itemBuilder: (_, i) {
final (agent, label, icon) = _agentDefs[i];
final gradient = _agentGradient(agent);
return GestureDetector(
onTap: () =>
ref.read(chatProvider.notifier).triggerAgent(agent, label),
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 13, vertical: 9),
decoration: BoxDecoration(
color: Colors.white,
color: Colors.white.withValues(alpha: 0.86),
borderRadius: BorderRadius.circular(999),
border: Border.all(color: AppColors.border),
boxShadow: AppColors.cardShadowLight,
border: Border.all(color: Colors.white, width: 1.2),
boxShadow: [
BoxShadow(
color: const Color(0xFF6366F1).withValues(alpha: 0.10),
blurRadius: 14,
offset: const Offset(0, 7),
),
],
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(icon, size: 16, color: AppColors.primary),
Container(
width: 16,
height: 16,
decoration: BoxDecoration(
gradient: gradient,
borderRadius: BorderRadius.circular(6),
),
child: Icon(icon, size: 11, color: Colors.white),
),
const SizedBox(width: 6),
Text(
label,
@@ -219,17 +242,39 @@ class _HomePageState extends ConsumerState<HomePage> {
);
}
LinearGradient _agentGradient(ActiveAgent agent) {
return switch (agent) {
ActiveAgent.consultation => AppColors.sageVioletGradient,
ActiveAgent.health => AppColors.meadowVioletGradient,
ActiveAgent.diet => AppColors.warmCareGradient,
ActiveAgent.medication => AppColors.primaryGradient,
ActiveAgent.report => AppColors.roseVioletGradient,
ActiveAgent.exercise => AppColors.calmHealthGradient,
_ => AppColors.primaryGradient,
};
}
Widget _buildBottomBar(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: Colors.white.withValues(alpha: 0.76),
border: const Border(top: BorderSide(color: AppColors.divider)),
color: Colors.white.withValues(alpha: 0.28),
border: Border(
top: BorderSide(color: Colors.white.withValues(alpha: 0.62)),
),
boxShadow: [
BoxShadow(
color: const Color(0xFF101828).withValues(alpha: 0.045),
blurRadius: 20,
offset: const Offset(0, -8),
),
],
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const SizedBox(height: 8),
const SizedBox(height: 10),
_buildAgentBar(),
const SizedBox(height: 8),
if (_pickedImagePath != null) _buildImagePreview(),
_buildInputBar(),
],
@@ -242,9 +287,9 @@ class _HomePageState extends ConsumerState<HomePage> {
margin: const EdgeInsets.fromLTRB(14, 8, 14, 0),
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
color: AppColors.cardInner,
color: Colors.white.withValues(alpha: 0.9),
borderRadius: BorderRadius.circular(14),
border: Border.all(color: AppColors.border),
border: Border.all(color: AppColors.borderLight),
),
child: Row(
children: [
@@ -275,7 +320,7 @@ class _HomePageState extends ConsumerState<HomePage> {
Widget _buildInputBar() {
return Padding(
padding: const EdgeInsets.fromLTRB(12, 8, 12, 10),
padding: const EdgeInsets.fromLTRB(12, 0, 12, 10),
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
@@ -306,15 +351,18 @@ class _HomePageState extends ConsumerState<HomePage> {
),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(22),
borderSide: const BorderSide(color: AppColors.border),
borderSide: const BorderSide(color: AppColors.borderLight),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(22),
borderSide: const BorderSide(color: AppColors.border),
borderSide: const BorderSide(color: AppColors.borderLight),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(22),
borderSide: const BorderSide(color: AppColors.primary),
borderSide: const BorderSide(
color: AppColors.auraIndigo,
width: 1.2,
),
),
),
onSubmitted: (_) => _sendMessage(),
@@ -442,9 +490,10 @@ class _HeaderIconButton extends StatelessWidget {
width: 38,
height: 38,
decoration: BoxDecoration(
color: Colors.white,
gradient: AppColors.surfaceGradient,
borderRadius: BorderRadius.circular(14),
border: Border.all(color: AppColors.border),
border: Border.all(color: AppColors.borderLight),
boxShadow: AppColors.cardShadowLight,
),
child: Icon(icon, size: 20, color: AppColors.textPrimary),
),
@@ -466,11 +515,12 @@ class _RoundToolButton extends StatelessWidget {
height: 42,
margin: const EdgeInsets.only(bottom: 2),
decoration: BoxDecoration(
color: Colors.white,
gradient: AppColors.surfaceGradient,
borderRadius: BorderRadius.circular(21),
border: Border.all(color: AppColors.border),
border: Border.all(color: AppColors.borderLight),
boxShadow: AppColors.cardShadowLight,
),
child: Icon(icon, size: 21, color: AppColors.textSecondary),
child: Icon(icon, size: 21, color: AppColors.primaryDark),
),
);
}