Перейти к основному содержимому

Использование аннотаций и генерация кода

CherryPick предоставляет продвинутую эргономику и безопасный DI благодаря аннотациям Dart и генерации кода. Это позволяет избавить вас от рутины — просто аннотируйте классы, поля и модули, запускайте генератор и используйте полностью автосвязанный DI!

Как это работает

  1. Аннотируйте сервисы, провайдеры и поля с помощью cherrypick_annotations.
  2. Генерируйте код с помощью cherrypick_generator и build_runner.
  3. Используйте автосгенерированные модули и миксины для автоматического внедрения.

Поддерживаемые аннотации

АннотацияTargetОписание
@injectable()классВключает автоподстановку полей (генерируется mixin)
@inject()полеАвтоподстановка через DI (работает с @injectable)
@module()классDI-модуль: методы — провайдеры и сервисы
@provideметодРегистрирует как DI-провайдер (можно с параметрами)
@instanceметод/классРегистрирует новый экземпляр (на каждый resolve, factory)
@singletonметод/классРегистрация как синглтон (один экземпляр на скоуп)
@namedполе/параметрИспользование именованных экземпляров для внедрения/resolve
@scopeполе/параметрВнедрение/resolve из другого (именованного) скоупа
@paramsпараметрДобавляет user-defined параметры во время resolve

Пример Field Injection

import 'package:cherrypick_annotations/cherrypick_annotations.dart';

@injectable()
class ProfilePage with _\$ProfilePage {
@inject()
late final AuthService auth;

@inject()
@scope('profile')
late final ProfileManager manager;

@inject()
@named('admin')
late final UserService adminUserService;
}
  • После запуска build_runner миксин _ProfilePage будет сгенерирован для внедрения.
  • Вызовите myProfilePage.injectFields(); чтобы все зависимости были внедрены автоматически.

Пример модуля/провайдера

@module()
abstract class AppModule {
@singleton
AuthService provideAuth(Api api) => AuthService(api);

@named('logging')
@provide
Future<Logger> provideLogger(@params Map<String, dynamic> args) async => ...;
}

Шаги использования

  1. Добавьте зависимости в pubspec.yaml.
  2. Аннотируйте классы и модули.
  3. Генерируйте код командой build_runner.
  4. Регистрируйте модули и используйте автосвязь.

Расширенные возможности

  • Используйте @named для внедрения по ключу.
  • Используйте @scope для внедрения из разных скоупов.
  • Используйте @params для передачи runtime-параметров.

Советы и FAQ

  • После изменений в DI-коде запускайте build_runner заново.
  • Не редактируйте .g.dart вручную.
  • Ошибки некорректных аннотаций определяются автоматически.

Ссылки