Build responsive Flutter layouts from the constraint system outward. Prefer simple flex composition and introduce fixed dimensions or overlays only when the design requires them for a concrete purpose.
Column and horizontal groups with Row.build method.Expanded, Flexible, and Spacer to distribute bounded free space.Column for vertical flow and Row for horizontal flow.mainAxisAlignment, crossAxisAlignment, and mainAxisSize.Expanded when a child must fill its allocated share of remaining main-axis space.Flexible when a child may use less than its allocated share.flex only to express proportional allocation. A child with flex: 2 receives twice the free-space share of a sibling with flex: 1.Spacer for flexible separation between siblings. Use SizedBox for deliberate, fixed gaps.Expanded or Flexible inside a Row when it must yield space to siblings.ListView or another scrollable when vertical content can exceed the viewport; Column does not scroll.Wrap when horizontal children should move onto another run instead of shrinking or overflowing.LayoutBuilder, breakpoints, or adaptive widgets when the composition itself must change with available space.SafeArea when content must avoid system intrusions.Avoid these as default layout mechanisms:
Stack with hardcoded Positioned coordinatesContainer, SizedBox, or ConstrainedBox with hardcoded screen-like width or heightUse them when they serve a concrete purpose, such as:
State the purpose in the code structure or a brief comment when it is not obvious.
Expanded and Flexible only under Row, Column, or Flex.Expanded or Flexible, or establish a meaningful finite constraint.Column that needs the outer column's remaining height by wrapping the inner column in Expanded.Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const Header(),
const SizedBox(height: 16),
Expanded(
child: Row(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const Flexible(flex: 2, child: PrimaryContent()),
const SizedBox(width: 16),
const Flexible(child: SecondaryContent()),
],
),
),
const SizedBox(height: 16),
const Actions(),
],
),
)
Change this composition at a breakpoint if the horizontal content cannot remain usable on a narrow screen; do not merely squeeze it.
Inspect these diagrams when decomposing a mockup into nested flex layouts:
Row containing a vertical content Column and an image.Row and Column widgets.Use the diagrams as structural references, not as fixed pixel templates.
Stack or Positioned usages have a concrete design reason.