flutter-build-responsive-layout
flutter/agent-plugins
Build Flutter layouts that adapt to any screen size using LayoutBuilder, MediaQuery, and Expanded/Flexible widgets.
What is flutter-build-responsive-layout?
This skill teaches how to create responsive Flutter layouts that work across mobile, tablet, and desktop form factors. Use it when you need your UI to automatically adjust to different window sizes and orientations without locking screen orientation or checking device hardware types.
- Use LayoutBuilder to make layout decisions based on parent widget constraints (maxWidth)
- Distribute space with Expanded and Flexible widgets in Row, Column, or Flex layouts
- Prevent UI stretching on large screens by wrapping components in ConstrainedBox with maxWidth limits
- Convert ListView to GridView with SliverGridDelegateWithMaxCrossAxisExtent for automatic column adjustment
- Support multiple input methods (touch, mouse, keyboard) with properly sized touch targets and keyboard navigation
How to install flutter-build-responsive-layout
npx skills add https://github.com/flutter/agent-plugins --skill flutter-build-responsive-layout- Flutter SDK installed and configured
- Basic understanding of Flutter widgets (Row, Column, Scaffold)
- Familiarity with BoxConstraints and the Flutter layout system
How to use flutter-build-responsive-layout
- 1.Identify the widget that needs adaptive behavior and wrap it in a LayoutBuilder
- 2.Extract constraints.maxWidth from the builder callback to determine available space
- 3.Define a breakpoint threshold (e.g., 600dp for large screens)
- 4.Return different widget trees based on whether maxWidth exceeds the breakpoint
- 5.For lists on large screens, convert ListView.builder to GridView.builder with SliverGridDelegateWithMaxCrossAxisExtent
- 6.For text/forms on large screens, wrap in ConstrainedBox with maxWidth and Center it
- 7.Test by resizing the app window and verifying layout transitions work smoothly
- 8.Ensure screen orientation is not locked to support all device form factors
Use cases
- Building a sidebar navigation that appears on tablets/desktops but collapses on mobile
- Creating a responsive grid that adjusts column count based on available window width
- Constraining a form or text content to optimal reading width on large displays
- Implementing a two-column layout (sidebar + content) that stacks vertically on small screens
- Supporting foldable devices and multi-window modes by basing layout decisions on available space
- Flutter developers building cross-platform apps
- Mobile app developers targeting tablet and desktop platforms
- Teams supporting foldable devices or multi-window scenarios
- Developers implementing accessibility-first responsive designs
flutter-build-responsive-layout FAQ
No. Device orientation does not accurately reflect available app window space. Use LayoutBuilder with constraints.maxWidth instead, as Flutter apps run in resizable windows, multi-window modes, and picture-in-picture.
Wrap full-width components in a ConstrainedBox with BoxConstraints(maxWidth: optimal_width), then wrap that in a Center widget to keep the content centered on large displays.
No. Base all layout decisions strictly on available window space using LayoutBuilder, not device hardware types. This ensures your app works correctly on resizable windows, foldables, and multi-window modes.
Expanded forces a child to fill all remaining space (equivalent to Flexible with fit: FlexFit.tight). Flexible allows a child to size itself up to a limit while expanding/contracting based on the flex factor.
Not recommended. Locking orientation causes severe layout issues on foldable devices and letterboxing. If business requirements mandate it, use the Display API to retrieve physical screen dimensions instead of MediaQuery.
Full instructions (SKILL.md)
Source of truth, from flutter/agent-plugins.
name: flutter-build-responsive-layout
description: Use LayoutBuilder, MediaQuery, or Expanded/Flexible to create a layout that adapts to different screen sizes. Use when you need the UI to look good on both mobile and tablet/desktop form factors.
metadata:
model: models/gemini-3.1-pro-preview
last_modified: Tue, 21 Apr 2026 20:17:40 GMT
Implementing Adaptive Layouts
Contents
- Space Measurement Guidelines
- Widget Sizing and Constraints
- Device and Orientation Behaviors
- Workflow: Constructing an Adaptive Layout
- Workflow: Optimizing for Large Screens
- Examples
Space Measurement Guidelines
Determine the available space accurately to ensure layouts adapt to the app window, not just the physical device.
- Use
MediaQuery.sizeOf(context)to get the size of the entire app window. - Use
LayoutBuilderto make layout decisions based on the parent widget's allocated space. Evaluateconstraints.maxWidthto determine the appropriate widget tree to return. - Do not use
MediaQuery.orientationOforOrientationBuildernear the top of the widget tree to switch layouts. Device orientation does not accurately reflect the available app window space. - Do not check for hardware types (e.g., "phone" vs. "tablet"). Flutter apps run in resizable windows, multi-window modes, and picture-in-picture. Base all layout decisions strictly on available window space.
Widget Sizing and Constraints
Understand and apply Flutter's core layout rule: Constraints go down. Sizes go up. Parent sets position.
- Distribute Space: Use
ExpandedandFlexiblewithinRow,Column, orFlexwidgets.- Use
Expandedto force a child to fill all remaining available space (equivalent toFlexiblewithfit: FlexFit.tightand aflexfactor of 1.0). - Use
Flexibleto allow a child to size itself up to a specific limit while still expanding/contracting. Use theflexfactor to define the ratio of space consumption among siblings.
- Use
- Constrain Width: Prevent widgets from consuming all horizontal space on large screens. Wrap widgets like
GridVieworListViewin aConstrainedBoxorContainerand define amaxWidthin theBoxConstraints. - Lazy Rendering: Always use
ListView.builderorGridView.builderwhen rendering lists with an unknown or large number of items.
Device and Orientation Behaviors
Ensure the app behaves correctly across all device form factors and input methods.
- Do not lock screen orientation. Locking orientation causes severe layout issues on foldable devices, often resulting in letterboxing (the app centered with black borders). Android large format tiers require both portrait and landscape support.
- Fallback for Locked Orientation: If business requirements strictly mandate a locked orientation, use the
Display APIto retrieve physical screen dimensions instead ofMediaQuery.MediaQueryfails to receive the larger window size in compatibility modes. - Support Multiple Inputs: Implement support for basic mice, trackpads, and keyboard shortcuts. Ensure touch targets are appropriately sized and keyboard navigation is accessible.
Workflow: Constructing an Adaptive Layout
Follow this workflow to implement a layout that adapts to the available BoxConstraints.
Task Progress:
- Identify the target widget that requires adaptive behavior.
- Wrap the widget tree in a
LayoutBuilder. - Extract the
constraints.maxWidthfrom the builder callback. - Define an adaptive breakpoint (e.g.,
largeScreenMinWidth = 600). - If
maxWidth > largeScreenMinWidth: Return a large-screen layout (e.g., aRowplacing a navigation sidebar and content area side-by-side). - If
maxWidth <= largeScreenMinWidth: Return a small-screen layout (e.g., aColumnor standard navigation-style approach). - Run validator -> resize the application window -> review layout transitions -> fix overflow errors.
Workflow: Optimizing for Large Screens
Follow this workflow to prevent UI elements from stretching unnaturally on large displays.
Task Progress:
- Identify full-width components (e.g.,
ListView, text blocks, forms). - If optimizing a list: Convert
ListView.buildertoGridView.builderusingSliverGridDelegateWithMaxCrossAxisExtentto automatically adjust column counts based on window size. - If optimizing a form or text block: Wrap the component in a
ConstrainedBox. - Apply
BoxConstraints(maxWidth: [optimal_width])to theConstrainedBox. - Wrap the
ConstrainedBoxin aCenterwidget to keep the constrained content centered on large screens. - Run validator -> test on desktop/tablet target -> review horizontal stretching -> adjust
maxWidthor grid extents.
Examples
Adaptive Layout using LayoutBuilder
Demonstrates switching between a mobile and desktop layout based on available width.
import 'package:flutter/material.dart';
const double largeScreenMinWidth = 600.0;
class AdaptiveLayout extends StatelessWidget {
const AdaptiveLayout({super.key});
@override
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (context, constraints) {
if (constraints.maxWidth > largeScreenMinWidth) {
return _buildLargeScreenLayout();
} else {
return _buildSmallScreenLayout();
}
},
);
}
Widget _buildLargeScreenLayout() {
return Row(
children: [
const SizedBox(width: 250, child: Placeholder(color: Colors.blue)),
const VerticalDivider(width: 1),
Expanded(child: const Placeholder(color: Colors.green)),
],
);
}
Widget _buildSmallScreenLayout() {
return const Placeholder(color: Colors.green);
}
}
Constraining Width on Large Screens
Demonstrates preventing a widget from consuming all horizontal space.
import 'package:flutter/material.dart';
class ConstrainedContent extends StatelessWidget {
const ConstrainedContent({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: ConstrainedBox(
constraints: const BoxConstraints(
maxWidth: 800.0, // Maximum width for readability
),
child: ListView.builder(
itemCount: 50,
itemBuilder: (context, index) {
return ListTile(
title: Text('Item $index'),
);
},
),
),
),
);
}
}
Related skills
More from flutter/agent-plugins and the wider catalog.

flutter-building-forms
Agent skill from flutter/agent-plugins.

flutter-building-layouts
Agent skill from flutter/agent-plugins.

flutter-building-plugins
Agent skill from flutter/agent-plugins.

flutter-caching-data
Agent skill from flutter/agent-plugins.

flutter-embedding-native-views
Agent skill from flutter/agent-plugins.

flutter-fix-layout-issues
Diagnose and fix Flutter layout errors like overflows and unbounded constraints using constraint-violation patterns.