Skip to content
Blog

Card Widget Patterns in Flutter: Elevated Surfaces Done Right

Use Flutter's Card widget for lists, dashboards, and content surfaces with elevation, shape, and ink handling done right.

Published on • November 4, 2026

AI Assistant

The Card widget is the default way to group related content on a raised surface. This follows the cited widget guide: a Card is a Material widget with a rounded shape and an elevation shadow, usually containing a ListTile, Padding, and column of rows.

Card(
  elevation: 2,
  margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
  child: ListTile(
    leading: const Icon(Icons.folder),
    title: const Text('Project files'),
    subtitle: const Text('Updated 2 hours ago'),
    trailing: const Icon(Icons.chevron_right),
    onTap: () {},
  ),
)

Flat cards

Set elevation: 0 for a flat, outlined look, and combine it with shape for a visible border:

Card(
  elevation: 0,
  shape: RoundedRectangleBorder(
    borderRadius: BorderRadius.circular(12),
    side: BorderSide(color: Colors.grey.shade300),
  ),
  child: const Padding(
    padding: EdgeInsets.all(16),
    child: Text('A flat card with a subtle border.'),
  ),
)

Colors and clipping

color overrides the surface color, and clipBehavior decides what happens when children paint outside the shape:

Card(
  color: Theme.of(context).colorScheme.primaryContainer,
  clipBehavior: Clip.antiAlias,
  child: Image.asset('assets/banner.jpg', height: 160, fit: BoxFit.cover),
)

Use Clip.antiAlias whenever a card contains images or anything that could overflow its rounded corners.

Custom shape

Cards accept any ShapeDecoration-style shape. A custom radius gives your app a signature look:

Card(
  elevation: 4,
  shape: ContinuousRectangleBorder(
    borderRadius: BorderRadius.circular(32),
  ),
  child: const Padding(
    padding: EdgeInsets.all(20),
    child: Text('Cards can take any shape you like.'),
  ),
)

Interactive cards

Combine Card with an InkWell inside for ripple feedback:

Card(
  child: InkWell(
    borderRadius: BorderRadius.circular(12),
    onTap: () {},
    child: const Padding(
      padding: EdgeInsets.all(16),
      child: Row(
        children: [
          Icon(Icons.settings),
          SizedBox(width: 12),
          Text('Settings'),
        ],
      ),
    ),
  ),
)

Takeaway: Card gives you a raised, rounded surface for free — choose the right elevation, add clipBehavior around images, and wrap interactive content in an InkWell to keep Material feedback intact.