Getting Started
Migration Guide

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

BeforeAfter
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}'),
    );
  }
}