One very common use case for SizedBox is when adding a gap between widgets inside a Row or Column.

In practice, this often leads to code that looks like this:

Column(
  children: const [
    Text('Spacing is a good idea in UX design.'),
    SizedBox(height: 12),
    Text('It makes your UI less cluttered.'),
  ]
)

or like this:

Row(
  children: [
    const Text('Image Preview:'),
    const SizedBox(width: 12),
    CachedNetworkImage(imageUrl: product.imageUrl),
  ]
)

There’s nothing wrong with the code above.

However, it’s very easy to forget the const modifier when needed.

And having to type SizedBox(height: someValue) many times over is a bit too verbose.

So here’s a little tip to improve things.

Defining gaps as const widgets

In a separate file, we can define all the SizedBoxes we need as compile time constants, using multiples of 4 pixels:

// gaps.dart 
const gapH4 = SizedBox(height: 4);
const gapH8 = SizedBox(height: 8);
const gapH12 = SizedBox(height: 12);
...
const gapH64 = SizedBox(height: 64);
 
const gapW4 = SizedBox(width: 4);
const gapW8 = SizedBox(width: 8);
const gapW12 = SizedBox(width: 12);
...
const gapW64 = SizedBox(width: 64);

Then, we can use them whenever we need:

// don't forget to import gaps.dart!
 
Column(
  children: const [
    Text('Spacing is a good idea in UX design.'),
    gapH12,
    Text('It makes your UI less cluttered.'),
  ]
)
 
Row(
  children: [
    const Text('Image Preview:'),
    gapW12,
    CachedNetworkImage(imageUrl: product.imageUrl),
  ]
)

Once again: your code will be more performant because all the gaps above are hardcoded as compile-time constants.

And you’ll have less typing to do, which is always a nice win! 👌

Why multiples of 4?

If you prefer, you can use multiples of 8.

The main point is that this will make your UI look more consistent, by giving you a strict set of values to choose from.

Happy coding!