// Author: fruit.com.cn import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../../core/data/services/auth_controller.dart'; import '../../../core/theme/app_colors.dart'; import '../../../core/theme/app_dimens.dart'; import '../../../core/theme/app_theme.dart'; import '../../../core/widgets/remote_image.dart'; import '../../../l10n/app_localizations.dart'; /// 「我的」页顶部身份卡。 class MineHeader extends StatelessWidget { const MineHeader({super.key, required this.onTap}); final VoidCallback onTap; @override Widget build(BuildContext context) { final l10n = AppLocalizations.of(context)!; final auth = context.watch(); final user = auth.user; final signedIn = auth.isSignedIn; final name = signedIn && (user?.nickname.isNotEmpty ?? false) ? user!.nickname : l10n.localViewer; final subtitle = signedIn && (user?.uid.isNotEmpty ?? false) ? 'ID: ${user!.uid}' : l10n.logInHint; return Container( key: const Key('mine-user-row'), decoration: BoxDecoration( color: AppColors.card, borderRadius: BorderRadius.circular(AppDimens.cardRadius), boxShadow: const [AppTheme.cardShadow], ), child: Material( color: Colors.transparent, borderRadius: BorderRadius.circular(AppDimens.cardRadius), clipBehavior: Clip.antiAlias, child: InkWell( onTap: onTap, child: Padding( padding: const EdgeInsets.all(AppDimens.cardPadding), child: Row( children: [ _avatar(user?.avatarUrl ?? ''), const SizedBox(width: AppDimens.spaceMd), Expanded(child: _labels(name, subtitle)), const Icon( Icons.chevron_right_rounded, color: AppColors.subtle, size: 20, ), ], ), ), ), ), ); } Widget _avatar(String path) { return Container( key: const Key('mine-avatar'), width: 64, height: 64, decoration: const BoxDecoration( color: AppColors.badgePink, shape: BoxShape.circle, ), clipBehavior: Clip.antiAlias, child: path.isEmpty ? const Icon( Icons.person_rounded, color: AppColors.badgePinkText, size: 30, ) : RemoteImage(path, fit: BoxFit.cover), ); } Widget _labels(String name, String subtitle) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( name, maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle( fontFamily: 'Outfit', color: AppColors.onSurface, fontSize: 18, fontWeight: FontWeight.w800, ), ), const SizedBox(height: AppDimens.spaceXs), Text( subtitle, maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle( color: AppColors.muted, fontSize: AppDimens.caption, ), ), ], ); } }