// Author: fruit.com.cn import 'package:flutter/material.dart'; import '../../../core/theme/app_colors.dart'; import '../../../core/theme/app_dimens.dart'; import '../../../core/widgets/remote_image.dart'; const double _infoHeight = 42; /// 「我的」页左下角最近观看迷你播放器。 class MineMiniPlayer extends StatelessWidget { const MineMiniPlayer({ super.key, required this.title, required this.coverUrl, required this.episodeLabel, required this.onTap, required this.onClose, }); final String title; final String coverUrl; final String episodeLabel; final VoidCallback onTap; final VoidCallback onClose; @override Widget build(BuildContext context) { return SizedBox( key: const Key('mine-mini-player'), width: AppDimens.mineMiniWidth, height: AppDimens.mineMiniHeight, child: DecoratedBox( decoration: BoxDecoration( color: AppColors.mineCard, borderRadius: BorderRadius.circular(AppDimens.mineMiniRadius), border: Border.all(color: AppColors.contentBorder), ), child: ClipRRect( borderRadius: BorderRadius.circular(AppDimens.mineMiniRadius), child: Material( color: AppColors.transparent, child: InkWell( onTap: onTap, child: Stack( children: [ Column( children: [ Expanded( child: RemoteImage( coverUrl, fit: BoxFit.cover, showFallbackIcon: true, fallbackColor: AppColors.contentSurface, ), ), SizedBox( height: _infoHeight, child: ColoredBox( color: AppColors.mineCard, child: Padding( padding: const EdgeInsets.symmetric( horizontal: 6, vertical: 4, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( title, maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle( color: AppColors.textPrimary, fontSize: AppDimens.mineMiniTitle, fontWeight: FontWeight.w600, ), ), Text( episodeLabel, maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle( color: AppColors.textSecondary, fontSize: AppDimens.mineMiniTitle, ), ), ], ), ), ), ), ], ), Positioned( right: 3, top: 3, child: IconButton( key: const Key('mine-mini-close'), tooltip: MaterialLocalizations.of( context, ).closeButtonTooltip, onPressed: onClose, style: IconButton.styleFrom( minimumSize: const Size.square(AppDimens.mineMiniClose), maximumSize: const Size.square(AppDimens.mineMiniClose), padding: EdgeInsets.zero, backgroundColor: AppColors.controlScrim, foregroundColor: AppColors.textPrimary, ), iconSize: 14, icon: const Icon(Icons.close_rounded), ), ), ], ), ), ), ), ), ); } }