Migration Guide
Bind Registration (v4.x to v5.x)
The bind registration system changed from returning a list to using an injector function.
Before (v4.x)
class MyModule extends Module {
@override
FutureOr<List<Bind<Object>>> binds() => [
Bind.singleton<ApiService>((i) => ApiService()),
Bind.singleton<DatabaseService>((i) => DatabaseService()),
];
}After (v5.x)
class MyModule extends Module {
@override
FutureBinds binds(Injector i) {
i.addSingleton<ApiService>((i) => ApiService());
i.addSingleton<DatabaseService>((i) => DatabaseService());
}
}Step-by-Step Migration
1. Change the method signature
// Before
@override
FutureOr<List<Bind<Object>>> binds() => [ ... ];
// After
@override
FutureBinds binds(Injector i) { ... }2. Replace Bind.* calls with i.add* calls
| Before | After |
|---|---|
Bind.singleton<T>((i) => ...) | i.addSingleton<T>((i) => ...) |
Bind.factory<T>((i) => ...) | i.add<T>((i) => ...) |
Bind.lazySingleton<T>((i) => ...) | i.addLazySingleton<T>((i) => ...) |
3. Use keys for multiple instances of the same type
@override
FutureBinds binds(Injector i) {
i.addSingleton<ApiService>((i) => ApiService(baseUrl: 'https://main.api'), key: 'main');
i.addSingleton<ApiService>((i) => ApiService(baseUrl: 'https://backup.api'), key: 'backup');
}Transition System (v4.x to v5.x)
The custom PageTransition enum was replaced with the go_transitions (opens in a new tab) package.
// Before (v4.x)
ChildRoute('/', child: (_, __) => HomePage(), transition: PageTransition.fade)
// After (v5.x)
ChildRoute('/', child: (_, __) => HomePage(), transition: GoTransitions.fade)See Page Transitions for the full list of available transitions.
Complete Example
class ProductsModule extends Module {
@override
FutureBinds binds(Injector i) {
i.addSingleton<ApiService>((i) => ApiService(), key: 'main');
i.addSingleton<DatabaseService>((i) => DatabaseService(api: i.get<ApiService>(key: 'main')));
i.add<CacheService>((i) => CacheService());
}
@override
List<ModularRoute> get routes => [
ChildRoute('/', child: (_, __) => ProductsPage()),
];
}
class ProductsPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final api = context.read<ApiService>(key: 'main');
final db = context.read<DatabaseService>();
return Scaffold(
body: Text('Services loaded: ${api.runtimeType}, ${db.runtimeType}'),
);
}
}