// 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/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.contentCard, borderRadius: BorderRadius.circular(AppDimens.mineCardRadius), border: Border.all(color: AppColors.contentBorder), ), child: Material( color: AppColors.transparent, borderRadius: BorderRadius.circular(AppDimens.mineCardRadius), 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.textSecondary, size: 20, ), ], ), ), ), ), ); } Widget _avatar(String path) { return Container( key: const Key('mine-avatar'), width: 64, height: 64, decoration: const BoxDecoration( color: AppColors.contentSurface, shape: BoxShape.circle, ), clipBehavior: Clip.antiAlias, child: path.isEmpty ? const Icon( Icons.person_rounded, color: AppColors.textPrimary, 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.textPrimary, fontSize: 18, fontWeight: FontWeight.w700, ), ), const SizedBox(height: AppDimens.spaceXs), Text( subtitle, maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle( color: AppColors.textSecondary, fontSize: AppDimens.caption, ), ), ], ); } }