Flutter依赖注入插件injectable_generator_micropackages的使用

Flutter依赖注入插件injectable_generator_micropackages的使用

injectable_generator_micropackages 是一个用于生成依赖注入代码的插件,它与 injectable 库配合使用,可以简化依赖注入的过程。本文将通过一个完整的示例来展示如何使用 injectable_generator_micropackages


1. 添加依赖

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

dependencies:
  injectable: ^x.x.x  # 替换为最新版本号

dev_dependencies:
  build_runner: ^x.x.x  # 替换为最新版本号
  injectable_generator: ^x.x.x  # 替换为最新版本号

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

flutter pub get

2. 创建服务类

接下来,创建两个服务类 ServiceImpl1ServiceImpl2,它们都实现了同一个接口 Service

// lib/service/service.dart
abstract class Service {}

// lib/service/service_impl_1.dart
import 'package:injectable/injectable_annotations.dart';

@named
@prod
@Injectable(as: Service)
class ServiceImpl1 extends Service {}

// lib/service/service_impl_2.dart
import 'package:injectable/injectable_annotations.dart';
import 'package:injectable/injectable.dart';

@Injectable(as: Service, env: [Environment.dev])
class ServiceImpl2 implements Service {}
  • @named:为 ServiceImpl1 注入一个名称。
  • @prod:表示该类在生产环境中可用。
  • @env:指定 ServiceImpl2 在开发环境(Environment.dev)中可用。

3. 创建注入器

创建一个注入器类,用于管理依赖注入。

// lib/injector.config.dart
import 'package:injectable/injectable.dart';
import 'package:injectable_generator_micropackages_example/service/service_impl_1.dart';
import 'package:injectable_generator_micropackages_example/service/service_impl_2.dart';

@injectableInit
void configureDependencies(String environment) =>
    $initInjectable(environment);

// lib/main.dart
import 'package:flutter/material.dart';
import 'package:injectable/injectable.dart';
import 'package:injectable_generator_micropackages_example/injector.config.dart';

final _getIt = GetIt.instance;

void main() {
  // 配置注入器
  configureDependencies(Environment.prod); // 设置为生产环境

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}
  • @injectableInit:生成初始化方法,用于配置注入器。
  • configureDependencies:根据环境配置注入器。

4. 使用依赖注入

现在可以在项目中使用注入器来获取实例。

// lib/repository/my_repository.dart
import 'package:injectable/injectable.dart';
import 'package:injectable_generator_micropackages_example/service/service.dart';

@injectable
class MyRepository {
  final Service _service;

  MyRepository(this._service);
}

// lib/main.dart
import 'package:flutter/material.dart';
import 'package:injectable/injectable.dart';
import 'package:injectable_generator_micropackages_example/injector.config.dart';
import 'package:injectable_generator_micropackages_example/repository/my_repository.dart';

final _getIt = GetIt.instance;

void main() {
  configureDependencies(Environment.prod);

  runApp(MyApp());
}

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

class MyHomePage extends StatelessWidget {
  final MyRepository _repository = _getIt<MyRepository>();

  MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Dependency Injection Example'),
      ),
      body: Center(
        child: Text('Injected Service: ${_repository._service.runtimeType}'),
      ),
    );
  }
}
  • _getIt<MyRepository>():通过注入器获取 MyRepository 实例。
  • _repository._service.runtimeType:打印注入的服务类型。

5. 运行示例

确保 Environment.prod 已正确配置,运行应用后,你应该会看到类似以下的输出:

Injected Service: ServiceImpl1
1 回复

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


injectable_generator_micropackages 是一个用于 Flutter 的依赖注入插件,它基于 injectableget_it 库,旨在简化依赖注入的配置和管理。它通过生成代码来自动化依赖注入的注册过程,减少了手动编写依赖注入代码的工作量。

安装步骤

  1. 添加依赖: 在你的 pubspec.yaml 文件中添加以下依赖:

    dependencies:
      injectable: ^1.5.3
      get_it: ^7.2.0
    
    dev_dependencies:
      injectable_generator_micropackages: ^1.0.0
      build_runner: ^2.1.7
  2. 运行 flutter pub get: 安装依赖项。

使用步骤

  1. 创建 injectable 配置文件: 在你的项目根目录下创建一个 injectable.config.dart 文件。这个文件将用于配置依赖注入。

    import 'package:injectable/injectable.dart';
    import 'package:your_project_name/di/injectable.config.dart';
    
    [@InjectableInit](/user/InjectableInit)(
      initializerName: r'$initGetIt', // default
      preferRelativeImports: true, // default
      asExtension: false, // default
    )
    void configureDependencies() => $initGetIt();
  2. 生成依赖注入代码: 运行以下命令来生成依赖注入代码:

    flutter pub run build_runner build

    这将会生成一个 injectable.config.dart 文件,其中包含了所有依赖注入的注册代码。

  3. 使用依赖注入: 在你的应用程序中,你可以通过 GetIt 来获取依赖项。例如:

    import 'package:get_it/get_it.dart';
    import 'package:your_project_name/di/injectable.config.dart';
    
    void main() {
      configureDependencies();
      final myService = GetIt.I<MyService>();
      // 使用 myService
    }

示例

假设你有一个 MyService 类,你可以通过以下方式将其注册为依赖项:

import 'package:injectable/injectable.dart';

[@Injectable](/user/Injectable)()
class MyService {
  void doSomething() {
    print('Doing something!');
  }
}

然后,你可以在其他地方通过 GetIt 获取并使用这个服务:

void main() {
  configureDependencies();
  final myService = GetIt.I<MyService>();
  myService.doSomething();
}

高级用法

  1. 命名依赖: 你可以使用 [@Named](/user/Named) 注解来注册和获取命名依赖项。

    [@Injectable](/user/Injectable)()
    [@Named](/user/Named)('serviceA')
    class MyServiceA implements MyService {
      void doSomething() {
        print('Doing something in Service A!');
      }
    }
    
    [@Injectable](/user/Injectable)()
    [@Named](/user/Named)('serviceB')
    class MyServiceB implements MyService {
      void doSomething() {
        print('Doing something in Service B!');
      }
    }

    获取命名依赖项:

    final serviceA = GetIt.I<MyService>(instanceName: 'serviceA');
    final serviceB = GetIt.I<MyService>(instanceName: 'serviceB');
  2. 环境配置: 你可以使用 @Environment 注解来根据不同的环境注册不同的依赖项。

    [@Injectable](/user/Injectable)(env: ['dev'])
    class DevService implements MyService {
      void doSomething() {
        print('Doing something in Dev environment!');
      }
    }
    
    [@Injectable](/user/Injectable)(env: ['prod'])
    class ProdService implements MyService {
      void doSomething() {
        print('Doing something in Prod environment!');
      }
    }

    injectable.config.dart 中配置环境:

    [@InjectableInit](/user/InjectableInit)(
      initializerName: r'$initGetIt',
      preferRelativeImports: true,
      asExtension: false,
      environmentFilter: EnvironmentFilter(environments: {'dev'}),
    )
    void configureDependencies() => $initGetIt();
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!