feat(app): 剧场页九宫格与极简我的页
This commit is contained in:
1 parent
dc8ca7b743
commit
35338cbfc8
46 files changed
+2353
-4358
No files matched your search
@@ -0,0 +1,113 @@
|
||||
// Author: fruit.com.cn
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../../../core/theme/app_colors.dart';
|
||||
import '../../../l10n/app_localizations.dart';
|
||||
|
||||
/// 「我的」页六个核心入口。
|
||||
enum MineDestination { watchlist, history, downloads, wallet, vip, settings }
|
||||
|
||||
/// 极简功能清单,避免在主页堆叠内容列表。
|
||||
class MineMenu extends StatelessWidget {
|
||||
const MineMenu({super.key, required this.walletValue, required this.onOpen});
|
||||
|
||||
final String walletValue;
|
||||
final ValueChanged<MineDestination> onOpen;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final l10n = AppLocalizations.of(context)!;
|
||||
return Container(
|
||||
key: const Key('mine-menu'),
|
||||
padding: const EdgeInsets.symmetric(vertical: 4),
|
||||
decoration: BoxDecoration(
|
||||
color: AppColors.card,
|
||||
borderRadius: BorderRadius.circular(14),
|
||||
),
|
||||
child: Column(children: [..._libraryTiles(l10n), ..._accountTiles(l10n)]),
|
||||
);
|
||||
}
|
||||
|
||||
List<Widget> _libraryTiles(AppLocalizations l10n) {
|
||||
return [
|
||||
_tile(
|
||||
key: const Key('mine-watchlist'),
|
||||
icon: Icons.bookmark_border_rounded,
|
||||
title: l10n.watchlist,
|
||||
onTap: () => onOpen(MineDestination.watchlist),
|
||||
),
|
||||
_tile(
|
||||
key: const Key('mine-history'),
|
||||
icon: Icons.history_rounded,
|
||||
title: l10n.watchHistory,
|
||||
onTap: () => onOpen(MineDestination.history),
|
||||
),
|
||||
_tile(
|
||||
key: const Key('mine-downloads'),
|
||||
icon: Icons.download_outlined,
|
||||
title: l10n.downloads,
|
||||
onTap: () => onOpen(MineDestination.downloads),
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
List<Widget> _accountTiles(AppLocalizations l10n) {
|
||||
return [
|
||||
_tile(
|
||||
key: const Key('mine-wallet'),
|
||||
icon: Icons.monetization_on_outlined,
|
||||
title: l10n.wallet,
|
||||
subtitle: walletValue,
|
||||
onTap: () => onOpen(MineDestination.wallet),
|
||||
),
|
||||
_tile(
|
||||
key: const Key('mine-vip'),
|
||||
icon: Icons.workspace_premium_outlined,
|
||||
title: l10n.vipMembership,
|
||||
onTap: () => onOpen(MineDestination.vip),
|
||||
),
|
||||
_tile(
|
||||
key: const Key('mine-settings'),
|
||||
icon: Icons.settings_outlined,
|
||||
title: l10n.settings,
|
||||
onTap: () => onOpen(MineDestination.settings),
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
Widget _tile({
|
||||
required Key key,
|
||||
required IconData icon,
|
||||
required String title,
|
||||
required VoidCallback onTap,
|
||||
String? subtitle,
|
||||
}) {
|
||||
return Material(
|
||||
color: Colors.transparent,
|
||||
child: ListTile(
|
||||
key: key,
|
||||
dense: true,
|
||||
minTileHeight: 48,
|
||||
contentPadding: const EdgeInsets.symmetric(horizontal: 14),
|
||||
leading: Icon(icon, color: AppColors.blueSoft, size: 19),
|
||||
title: Text(
|
||||
title,
|
||||
style: const TextStyle(color: AppColors.onSurface, fontSize: 12),
|
||||
),
|
||||
subtitle: subtitle == null
|
||||
? null
|
||||
: Text(
|
||||
subtitle,
|
||||
style: const TextStyle(color: AppColors.muted, fontSize: 9),
|
||||
),
|
||||
trailing: const Icon(
|
||||
Icons.chevron_right_rounded,
|
||||
color: AppColors.subtle,
|
||||
size: 18,
|
||||
),
|
||||
onTap: onTap,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user