Responsive Container in Flutter

In the earlier tutorial, we learnt how to create containers in flutter. These containers had a fixed width and height of 100. But in usual development scenarios, we’d want to have a responsive container in flutter to fit to the various screen resolutions of mobile devices.

We would like the container to respond to the various screen sizes of both web and mobile apps.

To follow along, you can get the code from the repo. The project folder is centralized_containers.

https://github.com/Prakashash18/flutterBlogs

If you unsure how to clone a repo, refer here.

Flutter MediaQuery Class

The key aspect of making the UI responsive is to get the resolutions of the device that the app is running, programmatically. For that, we can use the MediaQuery Class.

The MediaQuery class will be useful when it is used with the context of the running app. Thus, we will always pass the context to the MediaQuery class using the of method, allowing a responsive container in flutter.

MediaQuery.of(context)

The details of the device running the app are then extracted from this method. For this example, we are interested in the size of the device that is hosting our app.

MediaQuery.of(context).size

Flutter Width Responsiveness

For the code given, you can make the width responsive by stating the width of the box to take 50% of the available screen width, i.e. * 0.5

MediaQuery.of(context).size.width * 0.5
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
          child: Container(
        width: MediaQuery.of(context).size.width * 0.5, //responsive
        height: 100 ,
        decoration: BoxDecoration(
            color: Colors.blue,
            border: Border.all(color: Colors.red, width: 3),
            borderRadius: BorderRadius.all(Radius.circular(5))),
        child: Center(
          child: Text(
            "Hey There",
          ),
        ),
      )),
      // This trailing comma makes auto-formatting nicer for build methods.
    );
  }

Running the code on a mobile simulator should show this. If you’re unsure on how to run this code, see here.

To test out the responsiveness, change the device to chrome web. If unsure, refer here.

You can see the responsiveness of the container to various devices. It takes 50% of the available width.

Flutter Height Responsiveness

Getting the height to be responsive is a little more tricky. The height of a device is shared with the AppBar (if present in UI Design) and status bar (for mobile devices).

For example, we can edit the height of the container to take all available space as such

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
          child: Container(
        width: MediaQuery.of(context).size.width * 0.5, //responsive
        height: MediaQuery.of(context).size.height,
        decoration: BoxDecoration(
            color: Colors.blue,
            border: Border.all(color: Colors.red, width: 3),
            borderRadius: BorderRadius.all(Radius.circular(5))),
        child: Center(
          child: Text(
            "Hey There",
          ),
        ),
      )),
      // This trailing comma makes auto-formatting nicer for build methods.
    );
  }

Running this, shows the output as such. All the available height space is taken up.

If we were to run this on Chrome Web should also illustrate the responsiveness as well.

Leave a Comment