Implementation
static String generateProfileCard() {
return '''
import 'package:flutter/material.dart';
class ProfileCard extends StatelessWidget {
final String name;
final String email;
final String? avatarUrl;
final String? subtitle;
final VoidCallback? onTap;
final List<ProfileAction>? actions;
const ProfileCard({
Key? key,
required this.name,
required this.email,
this.avatarUrl,
this.subtitle,
this.onTap,
this.actions,
}) : super(key: key);
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return Card(
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20),
side: BorderSide(
color: theme.colorScheme.outline.withOpacity(0.1),
),
),
child: InkWell(
onTap: onTap,
borderRadius: BorderRadius.circular(20),
child: Padding(
padding: const EdgeInsets.all(20),
child: Column(
children: [
Row(
children: [
Hero(
tag: 'profile_avatar',
child: Container(
decoration: BoxDecoration(
shape: BoxShape.circle,
gradient: LinearGradient(
colors: [
theme.colorScheme.primary,
theme.colorScheme.primary.withOpacity(0.7),
],
),
boxShadow: [
BoxShadow(
color: theme.colorScheme.primary.withOpacity(0.3),
blurRadius: 12,
offset: const Offset(0, 4),
),
],
),
child: CircleAvatar(
radius: 36,
backgroundColor: Colors.transparent,
backgroundImage: avatarUrl != null
? NetworkImage(avatarUrl!)
: null,
child: avatarUrl == null
? Text(
name.isNotEmpty ? name[0].toUpperCase() : '?',
style: const TextStyle(
fontSize: 28,
fontWeight: FontWeight.bold,
color: Colors.white,
),
)
: null,
),
),
),
const SizedBox(width: 16),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
name,
style: theme.textTheme.titleLarge?.copyWith(
fontWeight: FontWeight.bold,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
const SizedBox(height: 4),
Text(
email,
style: theme.textTheme.bodyMedium?.copyWith(
color: theme.colorScheme.onSurfaceVariant,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
if (subtitle != null) ...[
const SizedBox(height: 2),
Text(
subtitle!,
style: theme.textTheme.bodySmall?.copyWith(
color: theme.colorScheme.onSurfaceVariant
.withOpacity(0.7),
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
],
],
),
),
if (onTap != null)
Icon(
Icons.chevron_right,
color: theme.colorScheme.onSurfaceVariant,
),
],
),
if (actions != null && actions!.isNotEmpty) ...[
const SizedBox(height: 20),
Divider(
height: 1,
color: theme.colorScheme.outline.withOpacity(0.2),
),
const SizedBox(height: 12),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: actions!.map((action) {
return Expanded(
child: InkWell(
onTap: action.onTap,
borderRadius: BorderRadius.circular(12),
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 8),
child: Column(
children: [
Icon(
action.icon,
color: theme.colorScheme.primary,
size: 24,
),
const SizedBox(height: 4),
Text(
action.label,
style: theme.textTheme.bodySmall?.copyWith(
fontWeight: FontWeight.w600,
),
),
],
),
),
),
);
}).toList(),
),
],
],
),
),
),
);
}
}
class ProfileAction {
final String label;
final IconData icon;
final VoidCallback onTap;
const ProfileAction({
required this.label,
required this.icon,
required this.onTap,
});
}
''';
}