merge: 调整搜索栏右侧入口样式

This commit is contained in:
Zhou Weidong committed 2026-10-22 18:46:27 +08:00
commit f4e5af19fe
5 files changed
+66 -8

No files matched your search

+1
View File
@@ -1115,6 +1115,7 @@ $ flutter test
- 四类卡片去底板/描边,封面统一 3:4、8 圆角、行距 10、封底标题间距 6;状态角标为右上角紧凑异形丝带。 - 四类卡片去底板/描边,封面统一 3:4、8 圆角、行距 10、封底标题间距 6;状态角标为右上角紧凑异形丝带。
- 标题下方恢复左对齐题材文字,使用 `|` 分隔、灰色小字,与封面状态角标保持独立。 - 标题下方恢复左对齐题材文字,使用 `|` 分隔、灰色小字,与封面状态角标保持独立。
- 首页搜索栏到一级、一级到二级、二级到网格间距为 8/8/10;非精选 tab 直接以 10 衔接网格。 - 首页搜索栏到一级、一级到二级、二级到网格间距为 8/8/10;非精选 tab 直接以 10 衔接网格。
- 搜索框右侧皇冠与礼物改为 40 热区、24 彩色图标,透明背景、间距 12,保留礼物角标。
- 播放量贴封面右下角(底 2、右 6),火焰图标 11 + 12/w400 纯文字,间距 4,并保留极淡底部渐变。 - 播放量贴封面右下角(底 2、右 6),火焰图标 11 + 12/w400 纯文字,间距 4,并保留极淡底部渐变。
- 修复二级 chip 运行时颜色误用 `const TextStyle` 的编译错误,并校正相关测试 Finder 类型。 - 修复二级 chip 运行时颜色误用 `const TextStyle` 的编译错误,并校正相关测试 Finder 类型。
- 全部短剧的地区、字幕、配音筛选 UI 已占位;以下接口待补:地区、字幕/配音筛选数据。 - 全部短剧的地区、字幕、配音筛选 UI 已占位;以下接口待补:地区、字幕/配音筛选数据。
+2
View File
@@ -39,6 +39,8 @@ abstract final class AppColors {
/// 金币与奖励。 /// 金币与奖励。
static const gold = Color(0xFFF3B34C); static const gold = Color(0xFFF3B34C);
static const goldDeep = Color(0xFFD9A23A); static const goldDeep = Color(0xFFD9A23A);
static const homeCrownGold = Color(0xFFF5C451);
static const homeGiftPink = Color(0xFFFF4D8D);
static const vipGoldStart = Color(0xFFF5D9A0); static const vipGoldStart = Color(0xFFF5D9A0);
static const vipGoldEnd = Color(0xFFE8B65A); static const vipGoldEnd = Color(0xFFE8B65A);
static const vipBadgeSurface = Color(0x1F3D2408); static const vipBadgeSurface = Color(0x1F3D2408);
+3 -1
View File
@@ -124,8 +124,10 @@ abstract final class AppDimens {
static const double homeSearchPrimaryGap = 8; static const double homeSearchPrimaryGap = 8;
static const double homePrimarySecondaryGap = 8; static const double homePrimarySecondaryGap = 8;
static const double homeSecondaryGridGap = 10; static const double homeSecondaryGridGap = 10;
static const double homeIconSlot = 44;
static const double homeHeaderIcon = 22; static const double homeHeaderIcon = 22;
static const double homeActionSlot = 40;
static const double homeActionIcon = 24;
static const double homeActionGap = 12;
/// 推荐分区。 /// 推荐分区。
static const double recommendSectionTitle = 17; static const double recommendSectionTitle = 17;
+8 -7
View File
@@ -143,13 +143,15 @@ class HomeGridHeader extends StatelessWidget {
_headerAction( _headerAction(
key: const Key('home-vip-entry'), key: const Key('home-vip-entry'),
icon: Icons.workspace_premium_outlined, icon: Icons.workspace_premium_outlined,
color: AppColors.homeCrownGold,
tooltip: l10n.vipMembership, tooltip: l10n.vipMembership,
onTap: callbacks.onOpenVip, onTap: callbacks.onOpenVip,
), ),
const SizedBox(width: AppDimens.spaceXs), const SizedBox(width: AppDimens.homeActionGap),
_headerAction( _headerAction(
key: const Key('home-wallet-entry'), key: const Key('home-wallet-entry'),
icon: Icons.card_giftcard_rounded, icon: Icons.card_giftcard_rounded,
color: AppColors.homeGiftPink,
tooltip: l10n.wallet, tooltip: l10n.wallet,
onTap: callbacks.onOpenWallet, onTap: callbacks.onOpenWallet,
badge: walletBadge, badge: walletBadge,
@@ -162,12 +164,13 @@ class HomeGridHeader extends StatelessWidget {
Widget _headerAction({ Widget _headerAction({
required Key key, required Key key,
required IconData icon, required IconData icon,
required Color color,
required String tooltip, required String tooltip,
required VoidCallback onTap, required VoidCallback onTap,
int? badge, int? badge,
}) { }) {
return SizedBox.square( return SizedBox.square(
dimension: AppDimens.homeIconSlot, dimension: AppDimens.homeActionSlot,
child: Stack( child: Stack(
clipBehavior: Clip.none, clipBehavior: Clip.none,
children: [ children: [
@@ -175,16 +178,14 @@ class HomeGridHeader extends StatelessWidget {
child: Tooltip( child: Tooltip(
message: tooltip, message: tooltip,
child: Material( child: Material(
color: AppColors.contentSurface, color: AppColors.transparent,
borderRadius: BorderRadius.circular(AppDimens.inputRadius),
child: InkWell( child: InkWell(
key: key, key: key,
borderRadius: BorderRadius.circular(AppDimens.inputRadius),
onTap: onTap, onTap: onTap,
child: Icon( child: Icon(
icon, icon,
size: AppDimens.homeHeaderIcon, size: AppDimens.homeActionIcon,
color: AppColors.navSelected, color: color,
), ),
), ),
), ),
+52
View File
@@ -9,6 +9,7 @@ import 'package:fruitshorts/core/data/repositories/favorite_repository.dart';
import 'package:fruitshorts/core/data/repositories/playback_repository.dart'; import 'package:fruitshorts/core/data/repositories/playback_repository.dart';
import 'package:fruitshorts/core/data/repositories/watch_history_repository.dart'; import 'package:fruitshorts/core/data/repositories/watch_history_repository.dart';
import 'package:fruitshorts/core/theme/app_colors.dart'; import 'package:fruitshorts/core/theme/app_colors.dart';
import 'package:fruitshorts/core/theme/app_dimens.dart';
import 'package:fruitshorts/core/widgets/app_bottom_nav.dart'; import 'package:fruitshorts/core/widgets/app_bottom_nav.dart';
import 'package:fruitshorts/pages/following/following_page.dart'; import 'package:fruitshorts/pages/following/following_page.dart';
import 'package:shared_preferences_platform_interface/in_memory_shared_preferences_async.dart'; import 'package:shared_preferences_platform_interface/in_memory_shared_preferences_async.dart';
@@ -50,6 +51,57 @@ void main() {
} }
expect(find.byKey(const Key('home-wallet-entry')), findsOneWidget); expect(find.byKey(const Key('home-wallet-entry')), findsOneWidget);
expect(find.byKey(const Key('home-wallet-badge')), findsOneWidget); expect(find.byKey(const Key('home-wallet-badge')), findsOneWidget);
final searchEntry = find.byKey(const Key('home-search-entry'));
final vipEntry = find.byKey(const Key('home-vip-entry'));
final walletEntry = find.byKey(const Key('home-wallet-entry'));
expect(
tester.getSize(vipEntry),
const Size.square(AppDimens.homeActionSlot),
);
expect(
tester.getSize(walletEntry),
const Size.square(AppDimens.homeActionSlot),
);
expect(
tester.getCenter(vipEntry).dy,
closeTo(tester.getCenter(searchEntry).dy, 0.1),
);
expect(
tester.getCenter(walletEntry).dy,
closeTo(tester.getCenter(searchEntry).dy, 0.1),
);
expect(
tester.getTopLeft(walletEntry).dx - tester.getTopRight(vipEntry).dx,
AppDimens.homeActionGap,
);
expect(
tester.getTopRight(walletEntry).dx,
closeTo(390 - AppDimens.feedPageHorizontal, 0.1),
);
final crown = tester.widget<Icon>(
find.descendant(
of: vipEntry,
matching: find.byIcon(Icons.workspace_premium_outlined),
),
);
final gift = tester.widget<Icon>(
find.descendant(
of: walletEntry,
matching: find.byIcon(Icons.card_giftcard_rounded),
),
);
expect(crown.size, AppDimens.homeActionIcon);
expect(crown.color, AppColors.homeCrownGold);
expect(gift.size, AppDimens.homeActionIcon);
expect(gift.color, AppColors.homeGiftPink);
expect(
tester
.widget<Material>(
find.ancestor(of: vipEntry, matching: find.byType(Material)).first,
)
.color,
AppColors.transparent,
);
expect(find.byKey(const Key('mine-mini-player')), findsNothing); expect(find.byKey(const Key('mine-mini-player')), findsNothing);
expect(find.byType(FloatingActionButton), findsNothing); expect(find.byType(FloatingActionButton), findsNothing);
for (final key in _keys.skip(1)) { for (final key in _keys.skip(1)) {