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. 创建服务类
接下来,创建两个服务类 ServiceImpl1
和 ServiceImpl2
,它们都实现了同一个接口 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
更多关于Flutter依赖注入插件injectable_generator_micropackages的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
injectable_generator_micropackages
是一个用于 Flutter 的依赖注入插件,它基于 injectable
和 get_it
库,旨在简化依赖注入的配置和管理。它通过生成代码来自动化依赖注入的注册过程,减少了手动编写依赖注入代码的工作量。
安装步骤
-
添加依赖: 在你的
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
-
运行
flutter pub get
: 安装依赖项。
使用步骤
-
创建
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();
-
生成依赖注入代码: 运行以下命令来生成依赖注入代码:
flutter pub run build_runner build
这将会生成一个
injectable.config.dart
文件,其中包含了所有依赖注入的注册代码。 -
使用依赖注入: 在你的应用程序中,你可以通过
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();
}
高级用法
-
命名依赖: 你可以使用
[@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');
-
环境配置: 你可以使用
@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();