Comporre il tutto: una card profilo con Row e Column annidate
Adesso mettiamo insieme i pezzi. Il segreto dei layout Flutter è annidare: una Row che contiene un'immagine e, accanto, una Column con i testi.
Schema mentale della card:
Card
└── Padding
└── Row
├── CircleAvatar
├── SizedBox (spazio)
├── Expanded
│ └── Column (nome, ruolo, città)
└── IconButton
L'Expanded attorno alla Column è essenziale: senza di esso, se il nome è lungo, la Row va in overflow. Con Expanded la Column riceve una larghezza massima e il testo può andare a capo o essere troncato con overflow: TextOverflow.ellipsis.
Crea un widget separato ProfileCard per mantenere il codice pulito e riutilizzabile.
class ProfileCard extends StatelessWidget {
const ProfileCard({
super.key,
required this.name,
required this.role,
required this.city,
});
final String name;
final String role;
final String city;
@override
Widget build(BuildContext context) {
final textTheme = Theme.of(context).textTheme;
return Card(
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: Padding(
padding: const EdgeInsets.all(16),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
CircleAvatar(
radius: 28,
backgroundColor: Colors.indigo.shade100,
child: Text(
name.characters.first,
style: textTheme.titleLarge,
),
),
const SizedBox(width: 16),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Text(
name,
style: textTheme.titleMedium,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
const SizedBox(height: 4),
Text(role, style: textTheme.bodyMedium),
const SizedBox(height: 4),
Row(
children: [
const Icon(Icons.place, size: 16),
const SizedBox(width: 4),
Flexible(
child: Text(
city,
overflow: TextOverflow.ellipsis,
),
),
],
),
],
),
),
IconButton(
icon: const Icon(Icons.more_vert),
onPressed: () {},
),
],
),
),
);
}
}
Risultato atteso
Usando `ProfileCard(name: 'Giulia Bianchi', role: 'Flutter Developer', city: 'Bologna')` nel body vedi una card con avatar circolare, tre righe di testo e un menu a tre puntini a destra.