Why this article

There are times when you may get confused about which widget to use when and especially the Box widgets which falls under the layout widgets category.

1. ConstrainedBox

It allows us to add flexibility to the height and width of the widget when its child’s size is subject to change.

When to use

It depends on your case/requirement. There are various cases where you may require to use it. I will try to simulate one problem here.

problem

Let’s say we have to show a container of at least a height of 50 and the child inside can have height 30 or 80. In any situation when the child is bigger than the container then the container should also expand rather than cutting the child’s view.

The below code does not match our expectations.

Container(

height: 50,

child: Icon(

Icons.add,

size: 80,

color: Colors.red,

),

)

The solution -

Container(

child: ConstrainedBox(

constraints: BoxConstraints(minHeight: 50),

child: Icon(

Icons.add,

size: 80,

color: Colors.red,

),

),

)

Even though the minimum height is 50, The container will try to be as big as its child since we have not given maxHeight property which is by default double.infinity

2. FittedBox

It allows us to scale and fit the child inside.

When to use

Whenever you want to show child inside parent and for you showing a full child is more important (even though it gets scales down) than the child being clipped off.

Problem

Let's say we have to show a full long text in a row.

The below code does not match our expectations.

Row(children: [

Expanded(

child: Text(

"It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.",

maxLines: 1,

style: TextStyle(fontSize: 23),

),

),

])

The solution -

Row(children: [

Expanded(

child: FittedBox(

child: Text(

"It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.",

maxLines: 1,

style: TextStyle(fontSize: 23),

),

),

),

])

Even though the font size is given as 23, It is ignored since it is inside FittedBox now.

3. FractionallySizedBox

It allows us to set the size of the child in percentage by setting a fraction of the total available space to width and height.

When to use

Whenever you want to use a container and want to set its size in percentage then go for this. I know that it can also be set using Mediaquery but this is also a dedicated widget just for this.

Basic syntax —

FractionallySizedBox(

widthFactor: 0.5,

heightFactor: 0.1,

child: Container(

decoration: BoxDecoration(color: Colors.greenAccent),

),

)

This would create a box with a width as 50% of horizontal space and height as 10% of vertical space.

Portrait layout —

Landscape layout —

4. LimitedBox

It allows us to give the size of the child in an unconstrained environment.

When to use

Whenever you have any child inside any scrollable widget and its size is not specified.

Problem

The below code won’t show anything on the screen because the container inside ListView doesn’t have its size specified.

ListView.builder(

padding: const EdgeInsets.all(8),

itemCount: 10,

itemBuilder: (BuildContext context, int index) {

return Container(

color: Colors.greenAccent,

);

})

The solution

ListView.builder(

padding: const EdgeInsets.all(8),

itemCount: 10,

itemBuilder: (BuildContext context, int index) {

return LimitedBox(

maxHeight: 50,

child: Container(

color: Colors.greenAccent,

),

);

})

Wrapping the container inside LimitedBox with maxHeight will start showing it.

5. SizedBox

It allows us to create a box with a fixed size. Pretty simple.

When to use

It is mostly used when we need to create some empty space between two widgets.

Basic syntax —

Column(

mainAxisAlignment: MainAxisAlignment.center,

children: <Widget>[

Container(

height: 20,

color: Colors.greenAccent,

),

SizedBox(

height: 10,

),

Container(

height: 20,

color: Colors.greenAccent,

)

],

)

That’s it. Thanks for reading.