flutterdartflutter-layoutflutter-widget

How can I layout widgets based on the size of the parent?


Let's say you have a parent widget that might have a variable size.

For example:

var container = new Container(
   height: 200.0, // Imagine this might change
   width: 200.0, // Imagine this might change
   // Imagine content in this container will 
   // depend on the parent container
   child: new Container(), 
);

And maybe you want to have the child of the parent container render something different based on the size that it's given.

Think of responsive design breakpoints, if the width is over X use this layout, if the width is under X use that layout.

What's the best way to do this in Flutter?


Solution

  • You will want to use the LayoutBuilder widget which will build at layout time and provides the parent widget's constraints.

    The LayoutBuilder takes in a build() function which has the the standard BuildContext along with the BoxConstraints as parameters that can be used to help dynamically render widgets based on size.

    Let's build a simple example of widget that renders "LARGE" if the parent width is greater than 200px and "SMALL" if the parent width is less or equal to that.

    var container = Container(
        // Toggling width from 100 to 300 will change what is rendered
        // in the child container
        width: 100.0,
        // width: 300.0
        child: LayoutBuilder(
            builder: (BuildContext context, BoxConstraints constraints) { 
                return Text(constraints.maxWidth > 200 ? 'BIG' : 'SMALL');        
            }
        ),
    );