// 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 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 _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 _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, ), ); } }