Case study
ExtensionResoft
An open-source Dart and Flutter package on pub.dev. It collects the form fields, validation, connectivity monitoring, animations and functional helpers we kept rewriting across Flutter projects.
ExtensionResoft
Building a Reusable Flutter Utility Layer
ExtensionResoft is a Dart and Flutter toolkit created to reduce repetitive implementation work across Flutter applications.
Instead of maintaining the same UI utilities, validation patterns, functional helpers, image components, animations, and common extensions independently across projects, I consolidated frequently recurring patterns into a reusable package.
The Problem
Building multiple Flutter applications exposes the same category of problems repeatedly.
A project may need:
Consistent form fields
Validation feedback
Image handling
Range controls
Rating components
Animations
Spacing helpers
Functional error handling
Optional-value abstractions
Connectivity monitoring
PIN interfaces
Common widget extensions
Implementing these individually increases duplication and makes design and behaviour harder to keep consistent.
ExtensionResoft was created as a reusable layer for those recurring needs.
Form and Input System
One of the package's larger components is its enhanced form-field system.
CustomTextField provides functionality such as:
Validation
Error, warning, and informational feedback
Password visibility
Dropdown support
Custom dimensions
Accessibility semantics
Theme adaptation
Validation-controller integration
Custom feedback presentation
The package also supports a fixed-height input model that automatically handles internal padding, reducing the amount of manual layout calculation required when aligning fields with other controls.
Functional Programming Utilities
ExtensionResoft also introduces functional programming primitives for Dart.
The package includes:
Either
Either<L, R> provides explicit success/failure modelling without relying entirely on exceptions or nullable values.
It supports operations such as:
mapbimapflatMapfoldtryCatchtryCatchAsynczipzipWith
Option
Option<T> provides explicit representation of an available or unavailable value through Some and None.
This provides a more expressive approach to optional data and transformations.
Unit
Unit provides a type-safe representation of an operation that intentionally produces no meaningful value.
Interactive Components
The package includes reusable interactive components such as:
CustomRangeSlider
A dual-handle range slider with support for:
Continuous and discrete values
Custom theming
Haptic feedback
Accessibility labels
Animated thumb interaction
Value clamping
Semantic formatting
CustomRatingBar
A flexible rating component supporting:
Half ratings
Tap interaction
Drag interaction
Custom icons
Custom colours
Animations
Read-only presentation
Rating text
These components are intended to provide production-ready behaviour rather than merely visual wrappers around basic Flutter widgets.
Image Handling
Image-related utilities provide a unified interface for different image sources.
The toolkit supports:
Network images
Asset images
File images
Circular profile images
Background images
Error states
Placeholders
Device-pixel-ratio-aware caching
Components such as AppImage, AppCircleImage, and ImageBackground are designed to reduce repeated image-handling code across applications.
Animation Utilities
Common animation patterns are also packaged for reuse.
Examples include:
AnimatedFadeScaleFadeSlideTransition
These provide reusable transition behaviour with configurable timing, curves, delays, and interaction patterns.
The objective is to make common animations easier to implement consistently without repeatedly rebuilding the same animation boilerplate.
Connectivity
The package includes connectivity-management utilities for applications that need to respond to network changes.
Rather than having every application implement its own connectivity abstraction, ExtensionResoft provides a consistent API for observing connectivity state and building more resilient application flows.
PIN Authentication UI
The package also contains a configurable PIN-entry component for authentication interfaces.
It provides control over:
PIN appearance
Input behaviour
Keyboard presentation
Validation
Completion callbacks
This allows applications to create authentication screens without repeatedly implementing the interaction model.
Developer Experience
A major objective of ExtensionResoft is reducing code required at the application level.
Instead of repeatedly writing low-level UI helpers, validation logic, animations, image wrappers, and utility extensions, applications can import the package and use a common API.
This also creates an opportunity to improve behaviour centrally: improvements to a reusable component can benefit multiple applications.
What I Engineered
The package covers both API design and implementation across:
Dart extensions
Flutter widgets
Form architecture
Validation
Functional programming primitives
Image abstractions
Animation utilities
Connectivity handling
Accessibility
Theming
Interactive controls
Reusable UI patterns
The package is designed as a general-purpose developer toolkit rather than a single-application utility collection.
Outcome
ExtensionResoft became a reusable foundation for common Flutter development patterns, reducing duplication and providing a consistent implementation layer across applications.
The project reflects a broader engineering principle I apply across my work: when the same problem appears repeatedly, it is often worth solving it once at the right abstraction level rather than repeatedly solving it inside individual products.
More work
More from our portfolio.
Phunplan
A Flutter app for discovering local activities, planning outings with friends and booking with activity providers. We built and integrated features across the mobile app, including bookings, maps, payments and notifications, and took it through release on Google Play and the App Store.
Pathveragroup
The corporate site for a UK education group with five practices, from university admissions to scholarships. We built it in Astro, with separate paths for students, universities and employers.
Let's talk
Have something similar in mind?
If your product or system has similar requirements, tell us about it and we'll talk through the approach.