113 lines
3.2 KiB
Dart
113 lines
3.2 KiB
Dart
// 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<AuthController>();
|
|
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: AppColors.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,
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
}
|