chore: 完成v6.7.0版本迭代更新

本次更新涵盖多个功能模块的优化与新增:
1. 新增Wi-Fi直连配对方式与协作画布模块
2. 完成设备管理重命名API与前端适配
3. 优化日签卡片空数据保护与UI细节
4. 新增剪贴板工具与每日运势会话
5. 修复应用锁恢复、语音消息录制等已知问题
6. 完善文件传输统计与配对逻辑
7. 更新安卓权限配置与iOS隐私描述
8. 新增自动化测试脚本与文档
9. 清理旧版审计报告与测试文件
This commit is contained in:
Developer
2026-05-14 05:35:18 +08:00
parent 2c1a87e7c5
commit 228095f80a
208 changed files with 45933 additions and 12870 deletions

View File

@@ -1,9 +1,9 @@
// ============================================================
// 闲言APP — 应用布局壳
// 创建时间: 2026-04-20
// 更新时间: 2026-04-30
// 作用: ShellRoute 布局壳,包含底部 GlassBottomBar 导航 + 灵感小红点
// 上次更新: 灵感Tab接入badges小红点显示未读推送数
// 更新时间: 2026-05-14
// 作用: ShellRoute 布局壳,包含底部 GlassBottomBar 导航 + 发现小红点
// 上次更新: 集成TabIconSprite精灵动画图标替换静态CupertinoIcons
// ============================================================
import 'package:badges/badges.dart' as badges;
@@ -16,8 +16,9 @@ import 'package:liquid_glass_widgets/liquid_glass_widgets.dart';
import '../theme/app_theme.dart';
import '../utils/interaction_animations.dart';
import '../../features/inspiration/presentation/widgets/tool_panel.dart';
import '../../features/inspiration/providers/chat_provider.dart';
import '../../features/settings/providers/theme_settings_provider.dart';
import '../../shared/widgets/tab_icon_sprite.dart';
class AppShell extends ConsumerWidget {
const AppShell({super.key, required this.child});
@@ -29,6 +30,30 @@ class AppShell extends ConsumerWidget {
final ext = AppTheme.ext(context);
final int currentIndex = child.currentIndex;
final unreadCount = ref.watch(chatProvider).unreadCount;
final settings = ref.watch(themeSettingsProvider);
final expressionStyle = settings.tabExpressionStyle;
final characterId = settings.tabCharacterStyleId;
final animIntensity = settings.animationIntensity.durationMultiplier;
int adjacentFor(int index) {
if (index == currentIndex) return 0;
if (index < currentIndex) return -1;
return 1;
}
Widget buildSpriteIcon(TabSpriteType type, int index, String label) {
return TabIconSprite(
type: type,
label: label,
isSelected: index == currentIndex,
adjacentDirection: adjacentFor(index),
animationIntensity: animIntensity,
characterId: characterId,
eyeScale: expressionStyle.eyeScale,
mouthCurve: expressionStyle.mouthCurve,
bounceMultiplier: expressionStyle.bounceMultiplier,
);
}
return CelebrationOverlay(
child: AnnotatedRegion<SystemUiOverlayStyle>(
@@ -47,17 +72,15 @@ class AppShell extends ConsumerWidget {
},
child: Scaffold(
extendBody: true,
body: Stack(children: [child, const ToolPanel()]),
body: Stack(children: [child]),
bottomNavigationBar: GlassBottomBar(
tabs: [
const GlassBottomBarTab(
label: '首页',
icon: Icon(CupertinoIcons.house),
activeIcon: Icon(CupertinoIcons.house_fill),
glowColor: Color(0xFFE8E8ED),
GlassBottomBarTab(
icon: buildSpriteIcon(TabSpriteType.home, 0, '闲言'),
activeIcon: buildSpriteIcon(TabSpriteType.home, 0, '闲言'),
glowColor: const Color(0xFFE8E8ED),
),
GlassBottomBarTab(
label: '灵感',
icon: badges.Badge(
showBadge: unreadCount > 0,
badgeContent: Text(
@@ -73,7 +96,7 @@ class AppShell extends ConsumerWidget {
padding: EdgeInsets.all(3),
),
position: badges.BadgePosition.topEnd(top: -4, end: -6),
child: const Icon(CupertinoIcons.sparkles),
child: buildSpriteIcon(TabSpriteType.discover, 1, '发现'),
),
activeIcon: badges.Badge(
showBadge: unreadCount > 0,
@@ -90,15 +113,14 @@ class AppShell extends ConsumerWidget {
padding: EdgeInsets.all(3),
),
position: badges.BadgePosition.topEnd(top: -4, end: -6),
child: const Icon(CupertinoIcons.sparkles),
child: buildSpriteIcon(TabSpriteType.discover, 1, '发现'),
),
glowColor: const Color(0xFFE8E8ED),
),
const GlassBottomBarTab(
label: '我的',
icon: Icon(CupertinoIcons.person),
activeIcon: Icon(CupertinoIcons.person_fill),
glowColor: Color(0xFFE8E8ED),
GlassBottomBarTab(
icon: buildSpriteIcon(TabSpriteType.profile, 2, '我的'),
activeIcon: buildSpriteIcon(TabSpriteType.profile, 2, '我的'),
glowColor: const Color(0xFFE8E8ED),
),
],
selectedIndex: currentIndex,
@@ -112,10 +134,9 @@ class AppShell extends ConsumerWidget {
barBorderRadius: 34,
horizontalPadding: 16,
verticalPadding: 16,
indicatorColor:
ext.isDark
? Colors.white.withValues(alpha: 0.08)
: Colors.black.withValues(alpha: 0.04),
indicatorColor: ext.isDark
? Colors.white.withValues(alpha: 0.08)
: Colors.black.withValues(alpha: 0.04),
indicatorSettings: LiquidGlassSettings(
thickness: 40,
blur: 25,
@@ -123,10 +144,9 @@ class AppShell extends ConsumerWidget {
chromaticAberration: 1.2,
lightIntensity: 3.5,
ambientStrength: 1.2,
glassColor:
ext.isDark
? const Color.from(alpha: 0.18, red: 1, green: 1, blue: 1)
: const Color.from(alpha: 0.12, red: 1, green: 1, blue: 1),
glassColor: ext.isDark
? const Color.from(alpha: 0.18, red: 1, green: 1, blue: 1)
: const Color.from(alpha: 0.12, red: 1, green: 1, blue: 1),
),
glassSettings: LiquidGlassSettings(
thickness: 30,
@@ -136,10 +156,9 @@ class AppShell extends ConsumerWidget {
lightIntensity: 1.2,
saturation: 1.0,
ambientStrength: 0.6,
glassColor:
ext.isDark
? const Color.from(alpha: 0.08, red: 1, green: 1, blue: 1)
: const Color.from(alpha: 0.05, red: 1, green: 1, blue: 1),
glassColor: ext.isDark
? const Color.from(alpha: 0.08, red: 1, green: 1, blue: 1)
: const Color.from(alpha: 0.05, red: 1, green: 1, blue: 1),
),
magnification: 1.12,
innerBlur: 1.5,