Использование аннотаций и генерация кода
CherryPick предоставляет продвинутую эргономику и безопасный DI благодаря аннотациям Dart и генерации кода. Это позволяет избавить вас от рутины — просто аннотируйте классы, поля и модули, запускайте генератор и используйте полностью автосвязанный DI!
Как это работает
- Аннотируйте сервисы, провайдеры и поля с помощью
cherrypick_annotations
. - Генерируйте код с помощью
cherrypick_generator
иbuild_runner
. - Используйте автосгенерированные модули и миксины для автоматического внедрения.
Поддерживаемые аннотации
Аннотация | 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 => ...;
}
Шаги использования
- Добавьте зависимости в
pubspec.yaml
. - Аннотируйте классы и модули.
- Генерируйте код командой build_runner.
- Регистрируйте модули и используйте автосвязь.
Расширенные возможности
- Используйте
@named
для внедрения по ключу. - Используйте
@scope
для внедрения из разных скоупов. - Используйте
@params
для передачи runtime-параметров.
Советы и FAQ
- После изменений в DI-коде запускайте build_runner заново.
- Не редактируйте
.g.dart
вручную. - Ошибки некорректных аннотаций определяются автоматически.