A Flutter Container is a convenience widget that combines common painting, positioning, and sizing widgets. It wraps around other widgets and provides powerful customization options through various properties. Think of a Container as a box that can have margins, padding, borders, background color, and other visual properties.
The Container widget doesn't introduce any visual element of its own unless you configure it to do so. Its main purpose is to offer customization options for its child widget.
Let's explore each property of the Flutter Container with practical examples to understand how they work:
The child
property holds the widget contained by the Container.
Container(
color: Colors.blue,
child: Text(
\"This text is the child of this Container\",
style: TextStyle(color: Colors.white),
),
)
Explanation: Here, the Container has a blue background and contains a Text widget. The Container will adjust its size to fit the Text widget if no size constraints are specified.
These properties explicitly set the dimensions of the Container.
Container(
width: 200,
height: 100,
color: Colors.green,
child: Center(
child: Text(\"Fixed Size Container\"),
),
)
Explanation: This Container has fixed dimensions of 200x100 pixels, regardless of its child's size. The child Text widget is centered within these dimensions.
The color
property sets the background color of the Container.
Container(
color: Colors.amber,
padding: EdgeInsets.all(20),
child: Text(\"Container with background color\"),
)
Explanation: This Container has an amber background color. Note that you cannot use both color
and decoration
properties together – use the color
property of BoxDecoration instead if you need both.
The padding
property creates empty space inside the Container, between its edges and its child.
Container(
padding: EdgeInsets.all(16.0),
color: Colors.lightBlue,
child: Text(\"This text has padding around it\"),
)
Explanation: The Container adds 16 pixels of padding on all sides between its edges and the Text widget.
EdgeInsets offers various constructors:
EdgeInsets.all(value)
- Same padding on all sidesEdgeInsets.symmetric(vertical: value, horizontal: value)
- Different padding for vertical and horizontal sidesEdgeInsets.fromLTRB(left, top, right, bottom)
- Custom padding for each sideThe margin
property creates empty space outside the Container, separating it from other widgets.
Container(
margin: EdgeInsets.all(20),
color: Colors.orange,
child: Text(\"This Container has margins\"),
)
Explanation: This adds 20 pixels of margin around the Container, pushing it away from neighboring widgets. Margins follow the same EdgeInsets patterns as padding.
The alignment
property determines how the child is positioned within the Container.
Container(
width: 200,
height: 200,
color: Colors.grey,
alignment: Alignment.bottomRight,
child: Text('Bottom Right Aligned Text'),
)
Explanation: The child Text widget is positioned at the bottom-right corner of the Container. Alignment offers various predefined options like topCenter, center, bottomLeft, etc., and also accepts custom alignment values.
The decoration
property provides advanced styling options through BoxDecoration.
Container(
width: 150,
height: 150,
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: Colors.blue, width: 3),
borderRadius: BorderRadius.circular(15),
),
child: Center(child: Text('Rounded Container')),
)
Explanation: This Container has a white background, a blue border that's 3 pixels wide, and rounded corners with a 15-pixel radius.
Container(
width: 200,
height: 100,
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.5),
spreadRadius: 5,
blurRadius: 7,
offset: Offset(0, 3),
),
],
),
child: Center(child: Text('Container with Shadow')),
)
Explanation: This Container has a shadow effect created using the boxShadow property. The shadow has a semi-transparent grey color, spreads 5 pixels, has a blur of 7 pixels, and is offset by 3 pixels downward.
Container(
width: 200,
height: 100,
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [Colors.blue, Colors.purple],
),
),
child: Center(child: Text('Gradient Container', style: TextStyle(color: Colors.white))),
)
Explanation: This Container has a linear gradient background that transitions from blue to purple diagonally. Flutter supports LinearGradient, RadialGradient, and SweepGradient types.
The constraints
property defines the minimum and maximum width and height for the Container.
Container(
constraints: BoxConstraints(
minWidth: 100,
maxWidth: 300,
minHeight: 50,
maxHeight: 150,
),
color: Colors.cyan,
child: Text(\"This Container has size constraints\"),
)
Explanation: This Container will never be smaller than 100x50 pixels or larger than 300x150 pixels, regardless of its child's size or parent's constraints.
The transform
property applies a transformation matrix to the Container.
Container(
width: 100,
height: 100,
color: Colors.red,
transform: Matrix4.rotationZ(0.2),
child: Center(child: Text('Rotated Container')),
)
Explanation: This Container is rotated slightly (about 11.5 degrees) around the Z-axis. Matrix4 provides various transformation methods like rotation, translation, scaling, etc.
Containers become powerful when combining multiple properties:
Container(
margin: EdgeInsets.all(10),
padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15),
width: 300,
decoration: BoxDecoration(
gradient: LinearGradient(colors: [Colors.indigo, Colors.purple]),
borderRadius: BorderRadius.circular(10),
boxShadow: [
BoxShadow(
color: Colors.black26,
blurRadius: 10,
offset: Offset(0, 5),
),
],
),
alignment: Alignment.center,
child: Text(
'Combined Properties',
style: TextStyle(color: Colors.white, fontSize: 18),
),
)
Explanation: This Container combines margin, padding, width, gradient background, rounded corners, shadow, and centered alignment to create a visually appealing button-like widget.
Containers can be nested to create complex layouts:
Container(
color: Colors.blue,
padding: EdgeInsets.all(16.0),
child: Container(
color: Colors.white,
padding: EdgeInsets.all(8.0),
child: Text('Nested Container Example'),
),
)
Explanation: The outer Container has a blue background with 16-pixel padding, containing an inner Container with a white background and 8-pixel padding, which contains the Text widget.
A common mistake is trying to use both decoration
and color
properties:
// This will cause an error
Container(
color: Colors.blue,
decoration: BoxDecoration(
border: Border.all(color: Colors.black),
),
)
Solution: Include the color inside the BoxDecoration:
Container(
decoration: BoxDecoration(
color: Colors.blue,
border: Border.all(color: Colors.black),
),
)
Understanding how Containers decide their size is crucial:
Container(
padding: EdgeInsets.all(10),
color: Colors.yellow,
child: Text(\"I determine my container's size\"),
)
Container(
color: Colors.lightGreen,
// No child, width, or height specified
)
Container(
width: 150,
height: 150,
color: Colors.red,
)
For simpler cases, consider using more specific widgets:
Padding: Use when you only need padding.
Padding(
padding: EdgeInsets.all(16.0),
child: Text(\"Just need padding\"),
)
SizedBox: Use when you only need to apply width/height constraints.
SizedBox(
width: 100,
height: 100,
child: Text(\"Just need sizing\"),
)
Center: Use when you only need to center a child.
Center(
child: Text(\"Just need centering\"),
)
For responsive designs, combine Containers with layout builders:
LayoutBuilder(
builder: (context, constraints) {
return Container(
width: constraints.maxWidth * 0.8,
height: constraints.maxHeight * 0.5,
color: Colors.purple,
child: Center(child: Text('Responsive Container')),
);
},
)
Explanation: This Container takes 80% of the available width and 50% of the available height, adapting to different screen sizes.