Multiple ways to solve RenderFlex overflow issues in Flutter
Overflow issues in Flutter, known as RenderFlex
overflow can be quite common at the beginning. However, once you understand what is happening, fixing them becomes easy. In this post, we will explore different ways to solve these issues in Flutter. We will start by understanding how these issues can occur and then discuss the possible solutions.
Producing the RenderFlex Overflow
In the following main.dart
file, there is a RenderFlex
overflow issues caused by two Container
widgets placed inside a Column
widget, see the code below:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Container Overflow Demo'),
),
body: Column(
children: [
Container(
color: Colors.green,
height: 400,
width: MediaQuery.of(context).size.width,
),
Container(
color: Colors.red,
height: 400,
width: MediaQuery.of(context).size.width,
),
],
),
),
);
}
}
The RenderFlex
overflow occurs because both Container
widgets have a height
of 400
, which exceeds the available screen size. Which makes the last Container
widget goes outside of our screen.

1. Using the SingleChildScrollView widget
The first and easiest solution involves using the SingleChildScrollView
widget. By wrapping our Column
widget with it, we can make the content scrollable.
body: SingleChildScrollView(
child: Column( ... ),
),
In the code snippet above, we just put our Column
widget inside the SingleChildScrollView
widget. By doing this, we fixed the RenderFlex
issue and we are now able to see both our Container
widgets.

This solution is perfect if you do not mind the user having to scroll down to see the rest of the available content.
2. Using the expanded widget
The Expanded
widget can be used to make sure that our Container
widgets only take the available space, see the code below:
body: Column(
children: [
Container(
color: Colors.green,
height: 400,
width: MediaQuery.of(context).size.width,
),
Expanded(
child: Container(
color: Colors.red,
width: MediaQuery.of(context).size.width,
),
),
],
),
In this code snippet, we wrapped our second Container
widget with the Expanded
widget. We also removed the height
property because the height of our Container
widget is now limited to the remaining height.

As you can see, the second Container
widget now uses only the remaining height.
However, this makes the Container
smaller. To improve this, we can divide the space evenly by also wrapping the first Container
widget with the Expanded
widget:
body: Column(
children: [
Expanded(
child: Container(
color: Colors.green,
width: MediaQuery.of(context).size.width,
),
),
Expanded(
child: Container(
color: Colors.red,
width: MediaQuery.of(context).size.width,
),
),
],
),
In this code snippet, we used the Expanded
widget for both Container
widgets and removed the height
property from both. As a result, both Container
widgets now have equal heights.

3. Using the MediaQuery class
The last solution involves using the MediaQuery
class to dynamically calculate the height for our Container
widgets. This approach is more technical, but it can be useful when the previous solutions do not meet your requirements.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final height = (MediaQuery.of(context).size.height -
MediaQuery.of(context).padding.top -
kToolbarHeight);
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Center(
child: Text('kToolbarHeight: ${kToolbarHeight.toString()}'),
),
),
body: Column(
children: [
Container(
color: Colors.green,
height: height * 0.5,
width: MediaQuery.of(context).size.width,
child: Center(
child: Text(
(height * 0.5).toString(),
style: TextStyle(color: Colors.white),
),
),
),
Container(
color: Colors.red,
height: height * 0.5,
width: MediaQuery.of(context).size.width,
child: Center(
child: Text(
(height * 0.5).toString(),
style: TextStyle(color: Colors.white),
),
),
),
],
),
),
);
}
}
In the code snippet, we create a variable called height
that calculates the available height for the Container
widgets. We do this by subtracting the top padding (obtained from MediaQuery.of(context).padding.top
) and the height of the AppBar
widget (using kToolbarHeight
) from the total screen height (accessed through MediaQuery.of(context).size.height
).
For both Container
widgets, we set their height to 50% of the calculated height. To demonstrate the calculations, I have included Text
widgets with the height values.

If you want more information about retrieving the height of the AppBar
widget and its padding check out my related post:

Conclusion
We have looked at different ways to fix RenderFlex
overflow issues in Flutter. The first solution makes the content scrollable using the SingleChildScrollView
widget. Another option is to use the Expanded
widget, which ensures that Container widgets share the available space. At last, we explored using the MediaQuery
class to calculate the height dynamically based on screen size, padding, and AppBar
height. With this knowledge, you are now able to solve RenderFlex
overflow issues on your own.