Kenresoft Technologies Ltd
Discuss a projectLog in
Back to Portfolio

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
TechnologyFlutter packageLibraryDartOpen Source

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:

  • map

  • bimap

  • flatMap

  • fold

  • tryCatch

  • tryCatchAsync

  • zip

  • zipWith

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:

  • AnimatedFadeScale

  • FadeSlideTransition

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.

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.