Flutter依赖注入插件get_it_injector_gen的使用

Flutter依赖注入插件get_it_injector_gen的使用

get_it_injector_gen 是一个代码生成包,它通过自动化注册 get_it 包中的类来简化依赖注入。该生成器基于 get_it_injector 的注解自动生成必要的代码。

为什么使用get_it_injector_gen

对于实际项目来说,手动管理依赖项可能会变得繁琐。get_it_injector_gen 的目标是自动化注册过程,使你能够更轻松地配置和管理依赖项。

特性

  • 灵活的注册:通过 get_it_injector 注解定义类应注册为工厂、单例还是懒加载单例。生成器将为你处理代码生成。
  • 注入顺序:定义类名模式以确定注入顺序,允许你控制类注入的顺序。
  • 分组:将可注入对象组织到具有各自优先级的组中,提供更细粒度的依赖管理方法。

开始使用

  1. 添加依赖

    在你的 pubspec.yaml 文件中添加 get_it_injectorget_it_injector_gen 包:

    dependencies:
        get_it_injector: # 最新版本
    
    dev_dependencies:
        get_it_injector_gen: # 最新版本
        build_runner: # 最新版本
    
  2. 配置构建运行器

    build.yaml 文件中配置构建运行器以使用 get_it_injector_gen

    targets:
        $default:
            builders:
                get_it_injector_gen:
                    generate_for:
                        - lib/**/*.dart
                    options:
                        # 添加你的选项
    

    注意:所有选项的大小写格式为 snake_case

    提示:有关可用选项的更多信息,请参阅设置接口文件。

  3. 向生成器提供类

    • 通过注解

      import 'package:get_it_injector/get_it_injector.dart';
      
      @singleton
      class MySingletonService {
          // 实现细节...
      }
      
    • 通过配置

      你可以使用 auto_register 选项包含所有类。

      你可以使用 groupsregisterfactoriessingletonslazy_singletonspriorities 来过滤应注册的类。每个选项接受一个正则表达式列表,用于匹配类名。

      targets:
          $default:
              builders:
                  get_it_injector_gen:
                      generate_for:
                          - lib/**/*.dart
                      options:
                          auto_register: true
                          groups:
                              - PATTERN # 正则表达式
                          register:
                              - PATTERN # 正则表达式
                          factories:
                              - PATTERN # 正则表达式
                          singletons:
                              - PATTERN # 正则表达式
                          lazy_singletons:
                              - PATTERN # 正则表达式
                          priorities:
                              - PATTERN # 正则表达式
      

      提示:有关每个输入的详细信息,请参阅设置接口文件。

  4. 添加设置函数

    import 'package:get_it/get_it.dart';
    import 'package:get_it_injector/get_it_injector.dart';
    
    import 'FILE_NAME.config.dart'; // 替换为这个文件的名称
    
    final getIt = GetIt.instance;
    
    [@setup](/user/setup)
    Future<void> setup() {
       getIt.init();
    }
    
  5. 运行构建命令生成注册代码

    使用以下命令运行构建命令:

    # 使用 flutter
    flutter pub run build_runner build --delete-conflicting-outputs
    
    # 使用 dart
    pub run build_runner build --delete-conflicting-outputs
    

问题和贡献

如果你遇到任何问题或有改进建议,请随时在 GitHub 上打开一个 issue 或贡献代码。

关于 build_runner 的说明

可以通过扁平化项目结构来优化构建运行器的性能,特别是如果你有嵌套文件夹。考虑在 build.yaml 中使用 exclude 选项来排除不必要的文件夹扫描。

targets:
    $default:
        builders:
            get_it_injector_gen:
                generate_for:
                    include:
                        - lib/**/*.dart
                    exclude:
                        - lib/ui/**

提示generate_for.includegenerate_for.excludebuild.yaml 格式的一部分。你可以在这里找到更多信息。

许可证

License

此软件根据 Apache 2.0 许可证发布。更多详情请访问 Apache 2.0 许可证


示例代码

// --- LICENSE ---
/**
Copyright 2025 CouchSurfing International Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// --- LICENSE ---
import 'package:get_it/get_it.dart';
import 'package:get_it_injector/get_it_injector.dart';

import 'FILE_NAME.config.dart'; // 替换为这个文件的名称

final getIt = GetIt.instance;

[@setup](/user/setup)
Future<void> setup() {
  getIt.init();
}

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

1 回复

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


get_it 是一个非常流行的 Flutter 依赖注入库,而 injector_gen 是一个代码生成器,可以帮助你自动生成依赖注入代码,减少手动编写的工作量。结合 get_itinjector_gen,你可以更高效地管理依赖注入。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 get_itinjectable 依赖。injectableinjector_gen 的前身,提供了代码生成功能。

dependencies:
  flutter:
    sdk: flutter
  get_it: ^7.2.0
  injectable: ^1.5.3

dev_dependencies:
  flutter_test:
    sdk: flutter
  build_runner: ^2.1.11
  injectable_generator: ^1.5.3

2. 创建配置文件

在项目根目录下创建一个 injectable.config.dart 文件,并添加以下内容:

import 'package:injectable/injectable.dart';
import 'package:my_app/di.config.dart';

@InjectableInit(
  initializerName: r'$initGetIt', // default
  preferRelativeImports: true, // default
  asExtension: false, // default
)
void configureDependencies() => $initGetIt();

3. 创建依赖注入配置

lib 目录下创建一个 di.dart 文件,并添加以下内容:

import 'package:get_it/get_it.dart';
import 'package:injectable/injectable.dart';

import 'di.config.dart';

final getIt = GetIt.instance;

@InjectableInit()
void configureDependencies() => $initGetIt(getIt);

4. 生成代码

运行以下命令生成依赖注入代码:

flutter pub run build_runner build

这将会生成 di.config.dart 文件,其中包含了自动生成的依赖注入代码。

5. 注册依赖

现在你可以在 lib 目录下的任何文件中注册依赖。例如,创建一个 services.dart 文件:

import 'package:injectable/injectable.dart';

@injectable
class MyService {
  void doSomething() {
    print('Doing something...');
  }
}

6. 使用依赖注入

在你的 main.dart 文件中,初始化依赖注入并使用注册的服务:

import 'package:flutter/material.dart';
import 'di.dart';
import 'services.dart';

void main() {
  configureDependencies();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final myService = getIt<MyService>();
    myService.doSomething();

    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Text('Hello, World!'),
      ),
    );
  }
}

7. 更多高级用法

injectable 提供了更多的注解和功能,例如:

  • @singleton:标记一个类为单例。
  • @lazySingleton:标记一个类为懒加载单例。
  • @factoryMethod:标记一个方法为工厂方法。
  • @module:用于定义模块,模块中可以包含多个依赖。

例如:

@module
abstract class MyModule {
  @lazySingleton
  MyService get myService => MyService();
}

8. 重新生成代码

每当你添加或修改依赖注入相关的代码时,都需要重新运行以下命令来生成新的代码:

flutter pub run build_runner build

或者,如果你希望在代码发生变化时自动重新生成代码,可以使用:

flutter pub run build_runner watch
回到顶部