NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #1477 most downloaded on pub.dev
Smart project structure with dependency injection and route management for Flutter.
Last release 19 days ago
19 Sep 2026
Ships unpredictably
gaps range from 8 days to 13 months
Rarely documented
notes for 12 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
7 years old
262 releases · first in 2019
Fix: feature modules reached through a `RouterOutlet` now get their binds. The outlet keeps its own sub-stack but never reported its entries to the mo
RouterOutlet now get their binds.
The outlet keeps its own sub-stack but never reported its entries to the
module manager, so a feature mounted as a child of a shell (e.g. / with a
RouterOutlet body) failed with "X not registered" when navigated to inside
the outlet. Outlet entries now activate and release their feature modules on
push, navigate, replace, pop and dispose, just like root stack entries.Feature modules can now consume shared/core dependencies
A feature module's module-level bind (addSingleton, add, addLazySingleton) now resolves dependencies registered in a root-owned shared/core module (a path-less module(...)). Previously only page-scoped provide binds could reach the core; a feature's module-level binds ran in a leaf injector blind to root-owned binds, forcing shared deps to be threaded in by hand.
A core consumer can now be a provide, the core itself, or a feature module-level bind — all alike. A feature's own bind still shadows a same-typed core bind (local wins; core is the fallback).
auto_injector >= 2.2.0Adds the opt-in upward resolution (addInjector(child, resolveUpward: true)) this builds on, fixes a dispose-listener accumulation in its layer graph, and adds an UpwardResolutionCycle guard against mutual upward links.
New dependency-injection.md sections: cross-module resolution and the async bootstrap idiom (await once in a Future<Module> builder so main stays thin and features take no parameters).
Full changelog: https://pub.dev/packages/flutter_modular/versions/7.1.0/changelog
One column per quarter.
path) — addSingleton,
add, addLazySingleton — now resolves dependencies registered in a
root-owned shared module (a path-less module(...), the "core"). Previously
only page-scoped provide binds could reach the core; a feature's
module-level binds ran in a leaf injector that couldn't see root-owned binds,
forcing shared deps to be threaded in by hand. This removes that asymmetry:
a core consumer can be a provide, the core itself, OR a feature
module-level bind — all alike. A feature's own bind still shadows a
same-typed core bind (local wins; core is the fallback).auto_injector >= 2.2.0, which adds the opt-in upward resolution
(addInjector(child, resolveUpward: true)) this builds on, fixes a
dispose-listener accumulation in its layer graph, and adds an
UpwardResolutionCycle guard against mutual upward links.Customizable route transitions. route(transition:) and the new app-wide ModularApp(defaultTransition:) now accept any PageTransition, an open contract
route(transition:) and the new app-wide
ModularApp(defaultTransition:) now accept any PageTransition, an open
contract that builds the route's Page. Three ways to supply one:
TransitionType presets (material, fade, none) — each value
now is a PageTransition, so existing transition: TransitionType.fade
keeps working;CustomTransition — the inline convenience: pass a
transitionsBuilder (same signature as PageRouteBuilder) and optionally
tune duration/reverseDuration/opaque/barrierColor/
barrierDismissible/fullscreenDialog; Modular still owns the Page;PageTransition yourself for full control of the Page
(e.g. a CupertinoPage with swipe-back, a fullscreenDialog, shared-axis
from the animations package).ModularApp.defaultTransition (default
TransitionType.material) applies to every route that doesn't declare its
own. Precedence: route-local → app default → material. route(transition:)
now defaults to null (inherit the app default) instead of forcing
material.`context.select (selector)` — the method-based twin of the Selector widget. Reads a value derived from a page-scoped T and rebuilds the calling widget
context.select<T, R>(selector) — the method-based twin of the Selector
widget. Reads a value derived from a page-scoped T and rebuilds the calling
widget only when the selected value changes (==). Mirrors
context.select from provider to ease migration; call it from build.📦 Published on pub.dev: https://pub.dev/packages/flutter_modular/versions/7.0.1
📦 Published on pub.dev: https://pub.dev/packages/flutter_modular/versions/7.0.1
Scoped.addStreamable<T>(ctor, (t) => t.stream, (t) => t.close()) — exposes the object itself via context.watch<T>() (read its synchronous state, call its methods) while rebuilds are driven by its stream. flutter_modular keeps no dependency on the bloc package (stream/close are caller callbacks). See the docs for a suggested addBloc extension covering both BLoC and Cubit.addListenable<T>(ctor, (t) => t.listenable, (t) => t.dispose()) — for objects whose reactivity is a Listenable property.add<T>(ctor) — non-reactive page-scoped object, readable via context.read/watch, disposed on unmount when it implements Disposable. Breaking: replaces addDisposable (removed; the Disposable interface is retained).addChangeNotifier reexpressed over addListenable; watch/read/Consumer/Selector now accept any Object (not just Listenable), so a non-Listenable reactive object can be exposed. Fully backward compatible.Full Changelog: https://github.com/Flutterando/modular/blob/master/CHANGELOG.md
Scoped.addStreamable<T>(ctor, (t) => t.stream, (t) => t.close()) exposes the object itself via
context.watch<T>() (read its synchronous state, call its methods) while
rebuilds are driven by its stream — flutter_modular keeps no dependency on
the bloc package (stream/close are caller callbacks). Companion
addListenable<T>(ctor, (t) => t.listenable, (t) => t.dispose()) for objects
whose reactivity is a Listenable property. See the docs for a suggested
addBloc extension covering both BLoC and Cubit.add<T>(ctor) — non-reactive page-scoped object, readable via
context.read/watch and disposed on unmount when it implements
Disposable. Breaking: replaces addDisposable, which is removed (the
Disposable interface is retained).addChangeNotifier reexpressed over addListenable;
watch/read/Consumer/Selector now accept any Object (not just
Listenable), so a non-Listenable reactive object can be exposed.Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Fix #713 Fix #676 Fix #632
Nothing published for this version
Fix: Parse params in RouteOutlet
Support Cubit
@deprecated ModularState . A few months of research showed us that ModularState caused unnecessary coupling with the view and made it difficult for th…
MaterialApp.modular() and Cupertino().modular(). return MaterialApp.router(
routeInformationParser: Modular.routeInformationParser,
routerDelegate: Modular.routerDelegate,
);
This modification aims to keep Modular support independent of WidgetApp updates, and can be used in other bootstraps such as FluentApp [fluent_ui].
ChangeNotifier/ValueNotifier, Stream and Triple`s Stores.Bind.onDispose property for calls to destroy, close or dispose methods FOR EACH BIND. This will make the dispose settings more straightforward and less universal. Therefore, Modular will manage the destruction of Binds that implement Disposable only. This is the new configuration:@override
final List<Bind> binds = [
Bind.singleton((i) => MyBloc(), onDispose: (bloc) => bloc.close()),
];The Bind.onDispose CANNOT be used in Bind type factory.
You can choose to use Bind.onDispose or implement the Disposable class.
Bind.selector. Generates a reactivity (Listenable/Stream) to be listened to when context.watch() is called.@override
final List<Bind> binds = [
//notifier return stream or listenable to use context.watch()
Bind.singleton((i) => MyBloc(), onDispose: (bloc) => bloc.close(), selector: (bloc) => bloc.stream),
];Bind's in order to use the context.watch() and auto dispose functionality. They are: BlocBind() and TripleBind(), which are available through external packages.Example:
@override
final List<Bind> binds = [
BlocBind.singleton((i) => MyBloc()),
];[BREAK CHANGE] Bind.export works only after imported.
@deprecated ModularState.
A few months of research showed us that ModularState caused unnecessary coupling with the view and made it difficult for those who used it to understand. For this reason, we decided to deprecate it to ensure code congruence for all professionals who use Modular.
Removed triple dependency.
Simplify docs.
Added Modular.setArguments.
Modular.setArguments('cody1024d');
// get
Modular.args.data; // -> cody1024d
//or
Bind((i) => MyClass(i.args.data));
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →