Flutter Simplifying UI Code with Extension Methods

Kai Thong
3 min readJul 28, 2023

--

Introduction

As a Flutter developer, you might have encountered scenarios where you need to perform repetitive tasks or apply specific modifications to widgets throughout your codebase. Flutter offers powerful widget customization capabilities, and one way to simplify widget usage and enhance code readability is by using extension methods. In this article, we will explore Flutter widget extensions and how they can streamline your UI code.

What is the problem?

In Flutter apps, we frequently need to apply similar modifications or customizations to widgets, such as changing colors, setting padding, adding borders, and more. Writing the same code repeatedly can lead to increased code duplication and reduced code readability.

Padding(
padding: EdgeInsets.symmetric(vertical: 6),
child: Column(
children: [
Padding(
padding: EdgeInsets.symmetric(horizontal: 10, vertical: 12),
child: Text("Hello")
),
Padding(
padding: EdgeInsets.symmetric(horizontal: 15, vertical: 10),
child: Text("Hello")
),
Padding(
padding: EdgeInsets.symmetric(horizontal: 20, vertical: 8),
child: Text("Hello")
),
],
)
)

Like the example above, we are using the same Padding widget in a Column, let’s imagine when the project becomes complex and when we add more and more widgets, then it will become hard to read.

Understanding Widget Extensions

Extensions in Dart allow you to add new functionalities to existing classes, including widgets. With widget extensions, you can create custom methods that can be called directly on widget instances, making your code more expressive and concise.

Step 1: Creating a Widget Extension

To create a widget extension, define a new file (e.g., widget_extensions.dart) in your project. Here's a basic example of how to create a widget extension method to set the padding of a widget:

extension WidgetExtension on Widget {
Widget padding(EdgeInsetsGeometry edge) => Padding(
padding: edge,
child: this,
);
}

In this example, we extend the widget and add a method named padding. The method takes a edgeparameter and returns a new widget with the specified padding.

Step 2: Using the Widget Extension

Now that we have created the WidgetExtension, we can use it in our code to set the padding of a widget:

class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Widget Extension Example'),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text(
"This is a demo picture",
).padding(const EdgeInsets.symmetric(vertical: 20)),
],
),
);
}
}

By using the .padding extension method on the Text widget, we can save a few lines of code by easily set the text padding without manually creating a new Paddinginstance.

Step 3: Customizing the Extension

Widget extensions can be as simple or complex as needed. You can create extensions to modify various properties of widgets, apply different styles, or even combine multiple widgets into custom compositions.

For example, let’s add a circular border to an Image widget:

Widget roundedBorder(BorderRadius radius) =>
ClipRRect(borderRadius: radius, child: this);

With this extension, we can now create an Image widget with a circular border:

Image.network(
"https://picsum.photos/500/300",
fit: BoxFit.cover,
).roundedBorder(const BorderRadius.all(Radius.circular(20)))

Preview

Conclusion

Flutter widget extensions can significantly improve your code’s readability and maintainability by encapsulating common widget modifications in concise and expressive methods. By extending widgets to cater to your specific needs, you can create a more intuitive and enjoyable development experience.

However, it’s essential to use widget extensions judiciously and maintain clarity in your code. Only create extensions for frequently used and well-defined modifications to ensure consistency across your app.

That’s all for this topic. Thank you for reading and I hope this was helpful for your development. You can find the full code here.

References

--

--

Kai Thong
Kai Thong

Written by Kai Thong

Flutter | Dart | Swift | SwiftUI | Kotlin | Jetpack Compose | React | Vue | Next.js | Nuxt.js

Responses (2)