CI

modular_codegen

Code generation for flutter_modular. Injection automation. Annotations Injectable, Param and Data.

Installation

Open your project's pubspec.yaml and add modular_codegen and build_runner as a dev dependency:

dev_dependencies:
  modular_codegen: any
  build_runner: any

Injection automation

Annotate your class with Injectable. Don't forget the part directive.

part 'home_controller.g.dart'; // ← part directive with your_file_name.g.dart

@Injectable() // ← Injectable annotation
class HomeController {
    ...

Execute the build_runner in the root of your project:

flutter pub run build_runner build

The generator will provide a $ClassName in the generated file, that can be injected in your module binds:

class HomeModule extends Module {
  @override
  List<Bind> get binds => [
        $HomeController, // ← As the class name was `HomeController`, the generated injectable is `$HomeController`
      ];

Injection automation will rely on the class constructor's parameters to generate the bindings.

// home_controller.dart
part 'home_controller.g.dart'; // ← part directive with your_file_name.g.dart

@Injectable() // ← Injectable annotation
class HomeController {
    final ApiRepository repository;
    HomeController({
        this.repository, // ← The parameters of the constructor will define the generated binding
    })

    ...
}

// Generated home_controller.g.dart
Bind(i) => HomeController(
    repository: i.get<ApiRepository>(), // ← repository parameter from constructor
);

Injectable configuration

Injectable annotation has two optional boolean params: singleton and lazy. By default, they are set to true. Thus, you can easily disable singleton behavior and lazy-loading behavior by passing these arguments.

Example:

@Injectable(singleton: false) // ← Disables singleton behavior
class ProductController {
    ...

Route parameters and arguments (Navigator)

If you need to pass data to your controller through the Navigator, you may annotate your constructor's parameters with Param or Data.

Param for dynamic route

For example, if your route URL is going to have an id parameter, provide a String parameter with the same name and annotated with Param.

part 'product_controller.g.dart'; // ← part directive with your_file_name.g.dart

@Injectable() // ← Injectable annotation
class ProductController {
    final String id

    ProductController({@Param this.id}) // ← This annotation will allow you to pass the `id` parameter in the route URL, like `/product/:id`

    ...
}

Data for Navigator arguments

Similarly, if you are going to pass complex objects to your route, annotate your constructor's parameters with Data.

part 'product_controller.g.dart'; // // ← part directive with your_file_name.g.dart

@Injectable() // ← Injectable annotation
class ProductController {
    final ProductItem item

    ProductController({@Data this.item}) //<- add @Data annotation
    ...
}

Then, pass the argument parameter to Modular.to.pushNamed:

Modular.to.pushNamed('/product', arguments: ProductItem());

Features and bugs

Please send feature requests and bugs at the issue tracker.