What is the purpose of the LayoutBuilder widget in Flutter?
#widget#layout#responsive
Answer
Overview
is a widget that builds itself based on the parent's constraints — specifically the maximum and minimum width and height available to it. It's the primary tool for building responsive layouts in Flutter.textLayoutBuilder
Basic Usage
dartLayoutBuilder( builder: (context, constraints) { print('Max width: ${constraints.maxWidth}'); print('Max height: ${constraints.maxHeight}'); return Container( width: constraints.maxWidth, child: Text('I know my container size!'), ); }, )
Responsive Layout Example
dartLayoutBuilder( builder: (context, constraints) { if (constraints.maxWidth > 600) { // Tablet / Desktop layout return Row( children: [ Expanded(child: SidebarWidget()), Expanded(flex: 3, child: ContentWidget()), ], ); } else { // Mobile layout return Column( children: [ ContentWidget(), ], ); } }, )
Responsive Grid
dartLayoutBuilder( builder: (context, constraints) { final columns = constraints.maxWidth > 600 ? 3 : 2; return GridView.builder( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: columns, crossAxisSpacing: 8, mainAxisSpacing: 8, ), itemCount: items.length, itemBuilder: (context, index) => ItemCard(item: items[index]), ); }, )
LayoutBuilder vs MediaQuery
| Feature | LayoutBuilder | MediaQuery |
|---|---|---|
| Measures | Parent widget's constraints | Entire screen size |
| Use case | Component-level responsive | App-level responsive |
| Rebuilds | When parent constraints change | When screen size changes |
| Recommended for | Reusable widgets with variable sizes | Screen-level layout decisions |
BoxConstraints Properties
dartLayoutBuilder( builder: (context, constraints) { constraints.maxWidth // Maximum available width constraints.maxHeight // Maximum available height constraints.minWidth // Minimum width constraints.minHeight // Minimum height constraints.biggest // Size(maxWidth, maxHeight) constraints.smallest // Size(minWidth, minHeight) }, )
Best Practice: Use
for building responsive widgets that need to adapt based on the space given by their parent — especially useful for reusable components that may be used in different size contexts.textLayoutBuilder