114 lines
3.1 KiB
Dart
114 lines
3.1 KiB
Dart
// 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,
|
|
),
|
|
);
|
|
}
|
|
}
|