Flutter依赖注入插件inject_creator_generator的使用

在Flutter开发中,依赖注入是一种常见的设计模式,可以帮助我们更好地管理对象的创建和生命周期。inject_creator_generator 是一个用于 inject_creator 库的生成器插件,能够简化依赖注入的实现。

本文将通过一个完整的示例演示如何使用 inject_creator_generator 来实现依赖注入。


使用步骤

1. 添加依赖

首先,在项目的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  inject_creator: ^0.1.0

dev_dependencies:
  inject_creator_generator: ^0.1.0
  build_runner: ^2.1.0

然后运行以下命令以安装依赖:

flutter pub get

2. 创建服务类

接下来,我们创建一些服务类作为依赖项。例如:

// services/user_service.dart
class UserService {
  void login() {
    print("User logged in");
  }
}

// services/product_service.dart
class ProductService {
  void fetchProducts() {
    print("Products fetched");
  }
}

3. 使用 @Injectable 注解定义模块

通过 @Injectable 注解,我们可以告诉 inject_creator_generator 哪些类需要被注入。以下是模块的定义:

// modules/app_module.dart
import 'package:inject_creator/inject_creator.dart';
import 'services/user_service.dart';
import 'services/product_service.dart';

@Injectable()
class AppModule {
  final userService = UserService();
  final productService = ProductService();
}

4. 使用 @GenerateInject 生成注入代码

main.dart 中,我们需要使用 @GenerateInject 注解来生成注入代码。运行 build_runner 后,会自动生成注入工厂类。

// main.dart
import 'package:flutter/material.dart';
import 'package:inject_creator/inject_creator.dart';
import 'modules/app_module.dart';

@GenerateInject()
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}

class HomePage extends StatelessWidget {
  // 使用注入获取服务实例
  final UserService _userService = InjectCreator.of().get<UserService>();
  final ProductService _productService = InjectCreator.of().get<ProductService>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Dependency Injection Example")),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () => _userService.login(),
              child: Text("Login"),
            ),
            ElevatedButton(
              onPressed: () => _productService.fetchProducts(),
              child: Text("Fetch Products"),
            ),
          ],
        ),
      ),
    );
  }
}

5. 运行构建工具生成代码

在终端中运行以下命令以生成注入代码:

flutter pub run build_runner build

运行后,inject_creator_generator 会为 AppModule 自动生成注入工厂类。


完整示例代码

以下是完整的代码结构:

lib/
├── main.dart
├── modules/
│   └── app_module.dart
└── services/
    ├── product_service.dart
    └── user_service.dart

更多关于Flutter依赖注入插件inject_creator_generator的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter依赖注入插件inject_creator_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


inject_creator_generator 是一个用于 Flutter 的依赖注入(DI)插件,它通过代码生成的方式简化了依赖注入的实现。使用这个插件,你可以通过注解和代码生成来自动生成依赖注入的代码,从而减少手动编写依赖注入代码的工作量。

安装步骤

  1. 添加依赖:在 pubspec.yaml 文件中添加 inject_creator_generatorbuild_runner 依赖。

    dependencies:
      flutter:
        sdk: flutter
      inject_creator: ^1.0.0
    
    dev_dependencies:
      build_runner: ^2.1.0
      inject_creator_generator: ^1.0.0
    
  2. 运行 flutter pub get:安装依赖。

使用步骤

  1. 创建依赖注入的类:使用 @inject 注解标记需要注入的类。

    import 'package:inject_creator/inject_creator.dart';
    
    @inject
    class MyService {
      void doSomething() {
        print('Doing something...');
      }
    }
    
  2. 生成依赖注入代码:运行 build_runner 生成依赖注入代码。

    flutter pub run build_runner build
    

    这将会生成一个 *.inject.dart 文件,其中包含了依赖注入的代码。

  3. 使用生成的代码:在应用中使用生成的依赖注入代码。

    import 'package:flutter/material.dart';
    import 'package:inject_creator/inject_creator.dart';
    import 'my_service.inject.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatelessWidget {
      final MyService myService = InjectCreator.get<MyService>();
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Inject Creator Example'),
          ),
          body: Center(
            child: ElevatedButton(
              onPressed: () {
                myService.doSomething();
              },
              child: Text('Do Something'),
            ),
          ),
        );
      }
    }
    

高级用法

  1. 单例模式:你可以通过 @singleton 注解来标记一个类为单例。

    @singleton
    class MySingletonService {
      void doSomething() {
        print('Doing something...');
      }
    }
    
  2. 依赖注入参数:你可以通过 @inject 注解的参数来指定依赖注入的方式。

    @inject
    class MyServiceWithDependency {
      final MySingletonService mySingletonService;
    
      MyServiceWithDependency(this.mySingletonService);
    
      void doSomething() {
        mySingletonService.doSomething();
      }
    }
    
  3. 自定义注入:你可以通过 @inject 注解的 builder 参数来指定自定义的注入方式。

    @inject(builder: MyServiceBuilder.build)
    class MyService {
      final String someValue;
    
      MyService(this.someValue);
    
      void doSomething() {
        print('Doing something with $someValue');
      }
    }
    
    class MyServiceBuilder {
      static MyService build() {
        return MyService('Custom Value');
      }
    }
回到顶部