mirror of
https://github.com/pese-git/cherrypick.git
synced 2026-01-24 13:47:24 +00:00
Compare commits
12 Commits
cherrypick
...
cherrypick
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
21955640d9 | ||
|
|
a62052daa5 | ||
|
|
7dbaa59c01 | ||
|
|
8438697107 | ||
|
|
9c42ba4cef | ||
|
|
1f6ee172a1 | ||
|
|
161e9085f4 | ||
|
|
ef49595627 | ||
|
|
0fd10488f3 | ||
|
|
46c2939125 | ||
|
|
6d5537f068 | ||
|
|
2480757797 |
47
CHANGELOG.md
47
CHANGELOG.md
@@ -3,6 +3,53 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## 2025-05-23
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Packages with breaking changes:
|
||||||
|
|
||||||
|
- There are no breaking changes in this release.
|
||||||
|
|
||||||
|
Packages with other changes:
|
||||||
|
|
||||||
|
- [`cherrypick_annotations` - `v1.1.0-dev.1`](#cherrypick_annotations---v110-dev1)
|
||||||
|
- [`cherrypick_generator` - `v1.1.0-dev.3`](#cherrypick_generator---v110-dev3)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### `cherrypick_annotations` - `v1.1.0-dev.1`
|
||||||
|
|
||||||
|
- **FEAT**: implement InjectGenerator.
|
||||||
|
|
||||||
|
#### `cherrypick_generator` - `v1.1.0-dev.3`
|
||||||
|
|
||||||
|
- **FEAT**: implement InjectGenerator.
|
||||||
|
|
||||||
|
|
||||||
|
## 2025-05-23
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Packages with breaking changes:
|
||||||
|
|
||||||
|
- There are no breaking changes in this release.
|
||||||
|
|
||||||
|
Packages with other changes:
|
||||||
|
|
||||||
|
- [`cherrypick_generator` - `v1.1.0-dev.2`](#cherrypick_generator---v110-dev2)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### `cherrypick_generator` - `v1.1.0-dev.2`
|
||||||
|
|
||||||
|
- **FIX**: update instance generator code.
|
||||||
|
|
||||||
|
|
||||||
## 2025-05-22
|
## 2025-05-22
|
||||||
|
|
||||||
### Changes
|
### Changes
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
## 1.1.0-dev.1
|
||||||
|
|
||||||
|
- **FEAT**: implement InjectGenerator.
|
||||||
|
|
||||||
## 1.1.0-dev.0
|
## 1.1.0-dev.0
|
||||||
|
|
||||||
- **FEAT**: implement generator for dynamic params.
|
- **FEAT**: implement generator for dynamic params.
|
||||||
|
|||||||
@@ -19,3 +19,6 @@ export 'src/instance.dart';
|
|||||||
export 'src/singleton.dart';
|
export 'src/singleton.dart';
|
||||||
export 'src/named.dart';
|
export 'src/named.dart';
|
||||||
export 'src/params.dart';
|
export 'src/params.dart';
|
||||||
|
export 'src/inject.dart';
|
||||||
|
export 'src/injectable.dart';
|
||||||
|
export 'src/scope.dart';
|
||||||
|
|||||||
20
cherrypick_annotations/lib/src/inject.dart
Normal file
20
cherrypick_annotations/lib/src/inject.dart
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2021 Sergey Penkovsky (sergey.penkovsky@gmail.com)
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
import 'package:meta/meta.dart';
|
||||||
|
|
||||||
|
@experimental
|
||||||
|
// ignore: camel_case_types
|
||||||
|
final class inject {
|
||||||
|
const inject();
|
||||||
|
}
|
||||||
20
cherrypick_annotations/lib/src/injectable.dart
Normal file
20
cherrypick_annotations/lib/src/injectable.dart
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2021 Sergey Penkovsky (sergey.penkovsky@gmail.com)
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
import 'package:meta/meta.dart';
|
||||||
|
|
||||||
|
@experimental
|
||||||
|
// ignore: camel_case_types
|
||||||
|
final class injectable {
|
||||||
|
const injectable();
|
||||||
|
}
|
||||||
@@ -11,11 +11,12 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
//
|
//
|
||||||
|
|
||||||
/// An annotation to specify that a method or class provides a new instance
|
/// ENGLISH:
|
||||||
/// each time it is requested.
|
/// Annotation to specify that a new instance should be provided on each request.
|
||||||
///
|
///
|
||||||
/// This is typically used to indicate that the annotated binding should
|
/// Use the `@instance()` annotation for methods or classes in your DI module
|
||||||
/// not be a singleton and a new object is created for every injection.
|
/// to declare that the DI container must create a new object every time
|
||||||
|
/// the dependency is injected (i.e., no singleton behavior).
|
||||||
///
|
///
|
||||||
/// Example:
|
/// Example:
|
||||||
/// ```dart
|
/// ```dart
|
||||||
@@ -35,6 +36,32 @@
|
|||||||
/// }
|
/// }
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
|
///
|
||||||
|
/// RUSSIAN (Русский):
|
||||||
|
/// Аннотация для создания нового экземпляра при каждом запросе.
|
||||||
|
///
|
||||||
|
/// Используйте `@instance()` для методов или классов в DI-модуле,
|
||||||
|
/// чтобы указать, что контейнер внедрения зависимостей должен создавать
|
||||||
|
/// новый объект при каждом обращении к зависимости (то есть, не синглтон).
|
||||||
|
///
|
||||||
|
/// Пример:
|
||||||
|
/// ```dart
|
||||||
|
/// @module()
|
||||||
|
/// abstract class AppModule extends Module {
|
||||||
|
/// @instance()
|
||||||
|
/// Foo foo() => Foo();
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// Будет сгенерирован следующий код:
|
||||||
|
/// ```dart
|
||||||
|
/// final class $AppModule extends AppModule {
|
||||||
|
/// @override
|
||||||
|
/// void builder(Scope currentScope) {
|
||||||
|
/// bind<Foo>().toInstance(() => foo());
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
// ignore: camel_case_types
|
// ignore: camel_case_types
|
||||||
final class instance {
|
final class instance {
|
||||||
const instance();
|
const instance();
|
||||||
|
|||||||
@@ -11,25 +11,57 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
//
|
//
|
||||||
|
|
||||||
/// An annotation used to mark a Dart class or library as a module.
|
/// ENGLISH:
|
||||||
|
/// Annotation for marking Dart classes or libraries as modules.
|
||||||
///
|
///
|
||||||
/// This annotation can be used for tooling, code generation,
|
/// Use the `@module()` annotation on abstract classes (or on a library)
|
||||||
/// or to provide additional metadata about the module.
|
/// to indicate that the class represents a DI (Dependency Injection) module.
|
||||||
|
/// This is commonly used in code generation tools to automatically register
|
||||||
|
/// and configure dependencies defined within the module.
|
||||||
///
|
///
|
||||||
/// Example:
|
/// Example:
|
||||||
/// ```dart
|
/// ```dart
|
||||||
/// @module()
|
/// @module()
|
||||||
/// abstract class AppModule extends Module {
|
/// abstract class AppModule extends Module {
|
||||||
|
/// // Dependency definitions go here.
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
/// Сгенерирует код:
|
///
|
||||||
|
/// Generates code like:
|
||||||
/// ```dart
|
/// ```dart
|
||||||
/// final class $AppModule extends AppModule {
|
/// final class $AppModule extends AppModule {
|
||||||
/// @override
|
/// @override
|
||||||
/// void builder(Scope currentScope) {
|
/// void builder(Scope currentScope) {
|
||||||
|
/// // Dependency registration...
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
///
|
///
|
||||||
|
/// RUSSIAN (Русский):
|
||||||
|
/// Аннотация для пометки классов или библиотек Dart как модуля.
|
||||||
|
///
|
||||||
|
/// Используйте `@module()` для абстрактных классов (или библиотек), чтобы
|
||||||
|
/// показать, что класс реализует DI-модуль (Dependency Injection).
|
||||||
|
/// Обычно используется генераторами кода для автоматической регистрации
|
||||||
|
/// и конфигурирования зависимостей, определённых в модуле.
|
||||||
|
///
|
||||||
|
/// Пример:
|
||||||
|
/// ```dart
|
||||||
|
/// @module()
|
||||||
|
/// abstract class AppModule extends Module {
|
||||||
|
/// // Определения зависимостей
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// Будет сгенерирован код:
|
||||||
|
/// ```dart
|
||||||
|
/// final class $AppModule extends AppModule {
|
||||||
|
/// @override
|
||||||
|
/// void builder(Scope currentScope) {
|
||||||
|
/// // Регистрация зависимостей...
|
||||||
/// }
|
/// }
|
||||||
/// }
|
/// }
|
||||||
|
/// ```
|
||||||
// ignore: camel_case_types
|
// ignore: camel_case_types
|
||||||
final class module {
|
final class module {
|
||||||
/// Creates a [module] annotation.
|
/// Creates a [module] annotation.
|
||||||
|
|||||||
@@ -11,10 +11,13 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
//
|
//
|
||||||
|
|
||||||
/// An annotation to assign a name or identifier to a class, method, or other element.
|
/// ENGLISH:
|
||||||
|
/// Annotation to assign a name or identifier to a class, method, or other element.
|
||||||
///
|
///
|
||||||
/// This can be useful for code generation, dependency injection,
|
/// The `@named('value')` annotation allows you to specify a string name
|
||||||
/// or providing metadata within a framework.
|
/// for a dependency, factory, or injectable. This is useful for distinguishing
|
||||||
|
/// between multiple registrations of the same type in dependency injection,
|
||||||
|
/// code generation, and for providing human-readable metadata.
|
||||||
///
|
///
|
||||||
/// Example:
|
/// Example:
|
||||||
/// ```dart
|
/// ```dart
|
||||||
@@ -25,7 +28,33 @@
|
|||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// Сгенерирует код:
|
/// This will generate:
|
||||||
|
/// ```dart
|
||||||
|
/// final class $AppModule extends AppModule {
|
||||||
|
/// @override
|
||||||
|
/// void builder(Scope currentScope) {
|
||||||
|
/// bind<Dio>().toProvide(() => dio()).withName('dio').singleton();
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// RUSSIAN (Русский):
|
||||||
|
/// Аннотация для задания имени или идентификатора классу, методу или другому элементу.
|
||||||
|
///
|
||||||
|
/// Аннотация `@named('значение')` позволяет указать строковое имя для зависимости,
|
||||||
|
/// фабрики или внедряемого значения. Это удобно для различения нескольких
|
||||||
|
/// регистраций одного типа в DI, генерации кода.
|
||||||
|
///
|
||||||
|
/// Пример:
|
||||||
|
/// ```dart
|
||||||
|
/// @module()
|
||||||
|
/// abstract class AppModule extends Module {
|
||||||
|
/// @named('dio')
|
||||||
|
/// Dio dio() => Dio();
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// Будет сгенерирован следующий код:
|
||||||
/// ```dart
|
/// ```dart
|
||||||
/// final class $AppModule extends AppModule {
|
/// final class $AppModule extends AppModule {
|
||||||
/// @override
|
/// @override
|
||||||
@@ -36,9 +65,13 @@
|
|||||||
/// ```
|
/// ```
|
||||||
// ignore: camel_case_types
|
// ignore: camel_case_types
|
||||||
final class named {
|
final class named {
|
||||||
/// The assigned name or identifier.
|
/// EN: The assigned name or identifier for the element.
|
||||||
|
///
|
||||||
|
/// RU: Назначенное имя или идентификатор для элемента.
|
||||||
final String value;
|
final String value;
|
||||||
|
|
||||||
/// Creates a [named] annotation with the given [value].
|
/// EN: Creates a [named] annotation with the given [value].
|
||||||
|
///
|
||||||
|
/// RU: Создаёт аннотацию [named] с заданным значением [value].
|
||||||
const named(this.value);
|
const named(this.value);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,11 +11,14 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
//
|
//
|
||||||
|
|
||||||
/// An annotation to indicate that a parameter is to be injected with run-time provided arguments.
|
/// ENGLISH:
|
||||||
|
/// Annotation to mark a method parameter for injection with run-time arguments.
|
||||||
///
|
///
|
||||||
/// Use this annotation to mark a method parameter that should receive arguments
|
/// Use the `@params()` annotation to specify that a particular parameter of a
|
||||||
/// passed during the resolution of a dependency (for example, through the
|
/// provider method should be assigned a value supplied at resolution time,
|
||||||
/// `.withParams(...)` method in the generated code).
|
/// rather than during static dependency graph creation. This is useful in DI
|
||||||
|
/// when a dependency must receive dynamic data passed by the consumer
|
||||||
|
/// (via `.withParams(...)` in the generated code).
|
||||||
///
|
///
|
||||||
/// Example:
|
/// Example:
|
||||||
/// ```dart
|
/// ```dart
|
||||||
@@ -27,6 +30,26 @@
|
|||||||
/// ```dart
|
/// ```dart
|
||||||
/// bind<String>().toProvideWithParams((args) => greet(args));
|
/// bind<String>().toProvideWithParams((args) => greet(args));
|
||||||
/// ```
|
/// ```
|
||||||
|
///
|
||||||
|
/// RUSSIAN (Русский):
|
||||||
|
/// Аннотация для пометки параметра метода, который будет внедряться со значением во время выполнения.
|
||||||
|
///
|
||||||
|
/// Используйте `@params()` чтобы указать, что конкретный параметр метода-провайдера
|
||||||
|
/// должен получать значение, передаваемое в момент обращения к зависимости,
|
||||||
|
/// а не на этапе построения графа зависимостей. Это полезно, если зависимость
|
||||||
|
/// должна получать данные динамически от пользователя или другого процесса
|
||||||
|
/// через `.withParams(...)` в сгенерированном коде.
|
||||||
|
///
|
||||||
|
/// Пример:
|
||||||
|
/// ```dart
|
||||||
|
/// @provide()
|
||||||
|
/// String greet(@params() dynamic params) => 'Hello $params';
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// Будет сгенерировано:
|
||||||
|
/// ```dart
|
||||||
|
/// bind<String>().toProvideWithParams((args) => greet(args));
|
||||||
|
/// ```
|
||||||
// ignore: camel_case_types
|
// ignore: camel_case_types
|
||||||
final class params {
|
final class params {
|
||||||
const params();
|
const params();
|
||||||
|
|||||||
@@ -11,28 +11,56 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
//
|
//
|
||||||
|
|
||||||
/// An annotation to indicate that a method provides a dependency to the module.
|
/// ENGLISH:
|
||||||
|
/// Annotation to declare a factory/provider method or class as a singleton.
|
||||||
///
|
///
|
||||||
/// This annotation is typically used in conjunction with dependency injection,
|
/// Use the `@singleton()` annotation on methods in your DI module to specify
|
||||||
/// marking methods whose return value should be registered as a provider.
|
/// that only one instance of the resulting object should be created and shared
|
||||||
/// The annotated method can optionally declare dependencies as parameters,
|
/// for all consumers. This is especially useful in dependency injection
|
||||||
/// which will be resolved and injected automatically.
|
/// frameworks and service locators.
|
||||||
///
|
///
|
||||||
/// Example:
|
/// Example:
|
||||||
/// ```dart
|
/// ```dart
|
||||||
/// @module()
|
/// @module()
|
||||||
/// abstract class AppModule extends Module {
|
/// abstract class AppModule extends Module {
|
||||||
/// @provide()
|
/// @singleton()
|
||||||
/// Foo foo(Bar bar) => Foo(bar);
|
/// Dio dio() => Dio();
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// This will generate:
|
/// This generates the following code:
|
||||||
/// ```dart
|
/// ```dart
|
||||||
/// final class $AppModule extends AppModule {
|
/// final class $AppModule extends AppModule {
|
||||||
/// @override
|
/// @override
|
||||||
/// void builder(Scope currentScope) {
|
/// void builder(Scope currentScope) {
|
||||||
/// bind<Foo>().toProvide(() => foo(currentScope.resolve<Bar>()));
|
/// bind<Dio>().toProvide(() => dio()).singleton();
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// RUSSIAN (Русский):
|
||||||
|
/// Аннотация для объявления фабричного/провайдерного метода или класса синглтоном.
|
||||||
|
///
|
||||||
|
/// Используйте `@singleton()` для методов внутри DI-модуля, чтобы указать,
|
||||||
|
/// что соответствующий объект (экземпляр класса) должен быть создан только один раз
|
||||||
|
/// и использоваться всеми компонентами приложения (единый общий экземпляр).
|
||||||
|
/// Это характерно для систем внедрения зависимостей и сервис-локаторов.
|
||||||
|
///
|
||||||
|
/// Пример:
|
||||||
|
/// ```dart
|
||||||
|
/// @module()
|
||||||
|
/// abstract class AppModule extends Module {
|
||||||
|
/// @singleton()
|
||||||
|
/// Dio dio() => Dio();
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// Будет сгенерирован следующий код:
|
||||||
|
/// ```dart
|
||||||
|
/// final class $AppModule extends AppModule {
|
||||||
|
/// @override
|
||||||
|
/// void builder(Scope currentScope) {
|
||||||
|
/// bind<Dio>().toProvide(() => dio()).singleton();
|
||||||
/// }
|
/// }
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
|
|||||||
21
cherrypick_annotations/lib/src/scope.dart
Normal file
21
cherrypick_annotations/lib/src/scope.dart
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2021 Sergey Penkovsky (sergey.penkovsky@gmail.com)
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
import 'package:meta/meta.dart';
|
||||||
|
|
||||||
|
@experimental
|
||||||
|
// ignore: camel_case_types
|
||||||
|
final class scope {
|
||||||
|
final String? name;
|
||||||
|
const scope(this.name);
|
||||||
|
}
|
||||||
@@ -11,11 +11,14 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
//
|
//
|
||||||
|
|
||||||
/// An annotation to declare a class as a singleton.
|
/// ENGLISH:
|
||||||
|
/// Annotation to declare a dependency as a singleton.
|
||||||
///
|
///
|
||||||
/// This can be used to indicate that only one instance of the class
|
/// Use the `@singleton()` annotation on provider methods inside a module
|
||||||
/// should be created, which is often useful in dependency injection
|
/// to indicate that only a single instance of this dependency should be
|
||||||
/// frameworks or service locators.
|
/// created and shared throughout the application's lifecycle. This is
|
||||||
|
/// typically used in dependency injection frameworks or service locators
|
||||||
|
/// to guarantee a single shared instance.
|
||||||
///
|
///
|
||||||
/// Example:
|
/// Example:
|
||||||
/// ```dart
|
/// ```dart
|
||||||
@@ -25,7 +28,36 @@
|
|||||||
/// Dio dio() => Dio();
|
/// Dio dio() => Dio();
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
/// Сгенерирует код:
|
///
|
||||||
|
/// This will generate code like:
|
||||||
|
/// ```dart
|
||||||
|
/// final class $AppModule extends AppModule {
|
||||||
|
/// @override
|
||||||
|
/// void builder(Scope currentScope) {
|
||||||
|
/// bind<Dio>().toProvide(() => dio()).singleton();
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// RUSSIAN (Русский):
|
||||||
|
/// Аннотация для объявления зависимости как синглтона.
|
||||||
|
///
|
||||||
|
/// Используйте `@singleton()` для методов-провайдеров внутри модуля,
|
||||||
|
/// чтобы указать, что соответствующий объект должен быть создан
|
||||||
|
/// единожды и использоваться во всём приложении (общий синглтон).
|
||||||
|
/// Это характерно для систем внедрения зависимостей и сервис-локаторов,
|
||||||
|
/// чтобы гарантировать один общий экземпляр.
|
||||||
|
///
|
||||||
|
/// Пример:
|
||||||
|
/// ```dart
|
||||||
|
/// @module()
|
||||||
|
/// abstract class AppModule extends Module {
|
||||||
|
/// @singleton()
|
||||||
|
/// Dio dio() => Dio();
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// Будет сгенерирован следующий код:
|
||||||
/// ```dart
|
/// ```dart
|
||||||
/// final class $AppModule extends AppModule {
|
/// final class $AppModule extends AppModule {
|
||||||
/// @override
|
/// @override
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
name: cherrypick_annotations
|
name: cherrypick_annotations
|
||||||
description: Collection annotations.
|
description: |
|
||||||
version: 1.1.0-dev.0
|
Set of annotations for CherryPick dependency injection library. Enables code generation and declarative DI for Dart & Flutter projects.
|
||||||
|
version: 1.1.0-dev.1
|
||||||
documentation: https://github.com/pese-git/cherrypick/wiki
|
documentation: https://github.com/pese-git/cherrypick/wiki
|
||||||
repository: https://github.com/pese-git/cherrypick
|
repository: https://github.com/pese-git/cherrypick/cherrypick_annotations
|
||||||
issue_tracker: https://github.com/pese-git/cherrypick/issues
|
issue_tracker: https://github.com/pese-git/cherrypick/issues
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
|
|||||||
@@ -1,3 +1,11 @@
|
|||||||
|
## 1.1.0-dev.3
|
||||||
|
|
||||||
|
- **FEAT**: implement InjectGenerator.
|
||||||
|
|
||||||
|
## 1.1.0-dev.2
|
||||||
|
|
||||||
|
- **FIX**: update instance generator code.
|
||||||
|
|
||||||
## 1.1.0-dev.1
|
## 1.1.0-dev.1
|
||||||
|
|
||||||
- **FIX**: optimize code.
|
- **FIX**: optimize code.
|
||||||
|
|||||||
@@ -7,6 +7,14 @@ builders:
|
|||||||
required_inputs: ["lib/**"]
|
required_inputs: ["lib/**"]
|
||||||
runs_before: []
|
runs_before: []
|
||||||
build_to: source
|
build_to: source
|
||||||
|
inject_generator:
|
||||||
|
import: "package:cherrypick_generator/inject_generator.dart"
|
||||||
|
builder_factories: ["injectBuilder"]
|
||||||
|
build_extensions: {".dart": [".cherrypick.g.dart"]}
|
||||||
|
auto_apply: dependents
|
||||||
|
required_inputs: ["lib/**"]
|
||||||
|
runs_before: []
|
||||||
|
build_to: source
|
||||||
|
|
||||||
targets:
|
targets:
|
||||||
$default:
|
$default:
|
||||||
@@ -14,3 +22,6 @@ targets:
|
|||||||
cherrypick_generator|module_generator:
|
cherrypick_generator|module_generator:
|
||||||
generate_for:
|
generate_for:
|
||||||
- lib/**.dart
|
- lib/**.dart
|
||||||
|
cherrypick_generator|inject_generator:
|
||||||
|
generate_for:
|
||||||
|
- lib/**.dart
|
||||||
@@ -14,3 +14,4 @@ library;
|
|||||||
//
|
//
|
||||||
|
|
||||||
export 'module_generator.dart';
|
export 'module_generator.dart';
|
||||||
|
export 'inject_generator.dart';
|
||||||
|
|||||||
186
cherrypick_generator/lib/inject_generator.dart
Normal file
186
cherrypick_generator/lib/inject_generator.dart
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2021 Sergey Penkovsky (sergey.penkovsky@gmail.com)
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
import 'dart:async';
|
||||||
|
import 'package:analyzer/dart/constant/value.dart';
|
||||||
|
import 'package:analyzer/dart/element/type.dart';
|
||||||
|
import 'package:build/build.dart';
|
||||||
|
import 'package:source_gen/source_gen.dart';
|
||||||
|
import 'package:analyzer/dart/element/element.dart';
|
||||||
|
import 'package:cherrypick_annotations/cherrypick_annotations.dart' as ann;
|
||||||
|
|
||||||
|
/// InjectGenerator generates a mixin for a class marked with @injectable()
|
||||||
|
/// and injects all fields annotated with @inject(), using CherryPick DI.
|
||||||
|
///
|
||||||
|
/// For Future<T> fields it calls .resolveAsync<T>(),
|
||||||
|
/// otherwise .resolve<T>() is used. Scope and named qualifiers are supported.
|
||||||
|
///
|
||||||
|
/// ---
|
||||||
|
///
|
||||||
|
/// InjectGenerator генерирует миксин для класса с аннотацией @injectable()
|
||||||
|
/// и внедряет все поля, помеченные @inject(), используя DI-фреймворк CherryPick.
|
||||||
|
///
|
||||||
|
/// Для Future<T> полей вызывается .resolveAsync<T>(),
|
||||||
|
/// для остальных — .resolve<T>(). Поддерживаются scope и named qualifier.
|
||||||
|
///
|
||||||
|
class InjectGenerator extends GeneratorForAnnotation<ann.injectable> {
|
||||||
|
const InjectGenerator();
|
||||||
|
|
||||||
|
/// The main entry point for code generation.
|
||||||
|
///
|
||||||
|
/// Checks class validity, collects injectable fields, and produces injection code.
|
||||||
|
///
|
||||||
|
/// Основная точка входа генератора. Проверяет класс, собирает инъектируемые поля и создает код внедрения зависимостей.
|
||||||
|
@override
|
||||||
|
FutureOr<String> generateForAnnotatedElement(
|
||||||
|
Element element,
|
||||||
|
ConstantReader annotation,
|
||||||
|
BuildStep buildStep,
|
||||||
|
) {
|
||||||
|
if (element is! ClassElement) {
|
||||||
|
throw InvalidGenerationSourceError(
|
||||||
|
'@injectable() can only be applied to classes.',
|
||||||
|
element: element,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
final classElement = element;
|
||||||
|
final className = classElement.name;
|
||||||
|
final mixinName = '_\$$className';
|
||||||
|
|
||||||
|
final buffer = StringBuffer()
|
||||||
|
..writeln('mixin $mixinName {')
|
||||||
|
..writeln(' void _inject($className instance) {');
|
||||||
|
|
||||||
|
// Collect and process all @inject fields.
|
||||||
|
// Собираем и обрабатываем все поля с @inject.
|
||||||
|
final injectFields =
|
||||||
|
classElement.fields.where(_isInjectField).map(_parseInjectField);
|
||||||
|
|
||||||
|
for (final parsedField in injectFields) {
|
||||||
|
buffer.writeln(_generateInjectionLine(parsedField));
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer
|
||||||
|
..writeln(' }')
|
||||||
|
..writeln('}');
|
||||||
|
|
||||||
|
return buffer.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Checks if a field has the @inject annotation.
|
||||||
|
///
|
||||||
|
/// Проверяет, отмечено ли поле аннотацией @inject.
|
||||||
|
static bool _isInjectField(FieldElement field) {
|
||||||
|
return field.metadata.any(
|
||||||
|
(m) => m.computeConstantValue()?.type?.getDisplayString() == 'inject',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Parses the field for scope/named qualifiers and determines its type.
|
||||||
|
/// Returns a [_ParsedInjectField] describing injection information.
|
||||||
|
///
|
||||||
|
/// Разбирает поле на наличие модификаторов scope/named и выясняет его тип.
|
||||||
|
/// Возвращает [_ParsedInjectField] с информацией о внедрении.
|
||||||
|
static _ParsedInjectField _parseInjectField(FieldElement field) {
|
||||||
|
String? scopeName;
|
||||||
|
String? namedValue;
|
||||||
|
|
||||||
|
for (final meta in field.metadata) {
|
||||||
|
final DartObject? obj = meta.computeConstantValue();
|
||||||
|
final type = obj?.type?.getDisplayString();
|
||||||
|
if (type == 'scope') {
|
||||||
|
scopeName = obj?.getField('name')?.toStringValue();
|
||||||
|
} else if (type == 'named') {
|
||||||
|
namedValue = obj?.getField('value')?.toStringValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final DartType dartType = field.type;
|
||||||
|
String coreTypeName;
|
||||||
|
bool isFuture;
|
||||||
|
|
||||||
|
if (dartType.isDartAsyncFuture) {
|
||||||
|
final ParameterizedType paramType = dartType as ParameterizedType;
|
||||||
|
coreTypeName = paramType.typeArguments.first.getDisplayString();
|
||||||
|
isFuture = true;
|
||||||
|
} else {
|
||||||
|
coreTypeName = dartType.getDisplayString();
|
||||||
|
isFuture = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _ParsedInjectField(
|
||||||
|
fieldName: field.name,
|
||||||
|
coreType: coreTypeName,
|
||||||
|
isFuture: isFuture,
|
||||||
|
scopeName: scopeName,
|
||||||
|
namedValue: namedValue,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Generates a line of code that performs the dependency injection for a field.
|
||||||
|
/// Handles resolve/resolveAsync, scoping, and named qualifiers.
|
||||||
|
///
|
||||||
|
/// Генерирует строку кода, которая внедряет зависимость для поля.
|
||||||
|
/// Учитывает resolve/resolveAsync, scoping и named qualifier.
|
||||||
|
String _generateInjectionLine(_ParsedInjectField field) {
|
||||||
|
final methodName = field.isFuture
|
||||||
|
? 'resolveAsync<${field.coreType}>'
|
||||||
|
: 'resolve<${field.coreType}>';
|
||||||
|
final openCall = (field.scopeName != null && field.scopeName!.isNotEmpty)
|
||||||
|
? "CherryPick.openScope(scopeName: '${field.scopeName}')"
|
||||||
|
: "CherryPick.openRootScope()";
|
||||||
|
final params = (field.namedValue != null && field.namedValue!.isNotEmpty)
|
||||||
|
? "(named: '${field.namedValue}')"
|
||||||
|
: '()';
|
||||||
|
|
||||||
|
return " instance.${field.fieldName} = $openCall.$methodName$params;";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Data structure representing all information required to generate
|
||||||
|
/// injection code for a field.
|
||||||
|
///
|
||||||
|
/// Структура данных, содержащая всю информацию,
|
||||||
|
/// необходимую для генерации кода внедрения для поля.
|
||||||
|
class _ParsedInjectField {
|
||||||
|
/// The name of the field / Имя поля.
|
||||||
|
final String fieldName;
|
||||||
|
|
||||||
|
/// The base type name (T or Future<T>) / Базовый тип (T или тип из Future<T>).
|
||||||
|
final String coreType;
|
||||||
|
|
||||||
|
/// True if the field type is Future<T>; false otherwise
|
||||||
|
/// Истина, если поле — Future<T>, иначе — ложь.
|
||||||
|
final bool isFuture;
|
||||||
|
|
||||||
|
/// Optional scope annotation argument / Опциональное имя scope.
|
||||||
|
final String? scopeName;
|
||||||
|
|
||||||
|
/// Optional named annotation argument / Опциональное имя named.
|
||||||
|
final String? namedValue;
|
||||||
|
|
||||||
|
_ParsedInjectField({
|
||||||
|
required this.fieldName,
|
||||||
|
required this.coreType,
|
||||||
|
required this.isFuture,
|
||||||
|
this.scopeName,
|
||||||
|
this.namedValue,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Builder factory. Used by build_runner.
|
||||||
|
///
|
||||||
|
/// Фабрика билдера. Используется build_runner.
|
||||||
|
Builder injectBuilder(BuilderOptions options) =>
|
||||||
|
PartBuilder([InjectGenerator()], '.inject.cherrypick.g.dart');
|
||||||
@@ -90,4 +90,4 @@ class ModuleGenerator extends GeneratorForAnnotation<ann.module> {
|
|||||||
/// файлов, где встречается @module().
|
/// файлов, где встречается @module().
|
||||||
/// ---------------------------------------------------------------------------
|
/// ---------------------------------------------------------------------------
|
||||||
Builder moduleBuilder(BuilderOptions options) =>
|
Builder moduleBuilder(BuilderOptions options) =>
|
||||||
PartBuilder([ModuleGenerator()], '.cherrypick.g.dart');
|
PartBuilder([ModuleGenerator()], '.module.cherrypick.g.dart');
|
||||||
|
|||||||
@@ -125,9 +125,11 @@ class BindSpec {
|
|||||||
final multiLine = fnArgs.length > 60 || fnArgs.contains('\n');
|
final multiLine = fnArgs.length > 60 || fnArgs.contains('\n');
|
||||||
switch (bindingType) {
|
switch (bindingType) {
|
||||||
case BindingType.instance:
|
case BindingType.instance:
|
||||||
return isAsyncInstance
|
throw StateError(
|
||||||
? '.toInstanceAsync(($fnArgs) => $methodName($fnArgs))'
|
'Internal error: _generateWithParamsProvideClause called for @instance binding with @params.');
|
||||||
: '.toInstance(($fnArgs) => $methodName($fnArgs))';
|
//return isAsyncInstance
|
||||||
|
// ? '.toInstanceAsync(($fnArgs) => $methodName($fnArgs))'
|
||||||
|
// : '.toInstance(($fnArgs) => $methodName($fnArgs))';
|
||||||
case BindingType.provide:
|
case BindingType.provide:
|
||||||
default:
|
default:
|
||||||
if (isAsyncProvide) {
|
if (isAsyncProvide) {
|
||||||
@@ -218,6 +220,15 @@ class BindSpec {
|
|||||||
final bindingType =
|
final bindingType =
|
||||||
hasInstance ? BindingType.instance : BindingType.provide;
|
hasInstance ? BindingType.instance : BindingType.provide;
|
||||||
|
|
||||||
|
// PROHIBIT @params with @instance bindings!
|
||||||
|
if (bindingType == BindingType.instance && hasParams) {
|
||||||
|
throw InvalidGenerationSourceError(
|
||||||
|
'@params() (runtime arguments) cannot be used together with @instance() on method $methodName. '
|
||||||
|
'Use @provide() instead if you want runtime arguments.',
|
||||||
|
element: method,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// -- Extract inner type for Future<T> and set async flags.
|
// -- Extract inner type for Future<T> and set async flags.
|
||||||
bool isAsyncInstance = false;
|
bool isAsyncInstance = false;
|
||||||
bool isAsyncProvide = false;
|
bool isAsyncProvide = false;
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
name: cherrypick_generator
|
name: cherrypick_generator
|
||||||
description: Code generator for cherrypick annotations
|
description: |
|
||||||
version: 1.1.0-dev.1
|
Source code generator for the cherrypick dependency injection system. Processes annotations to generate binding and module code for Dart & Flutter projects.
|
||||||
|
|
||||||
|
version: 1.1.0-dev.3
|
||||||
documentation: https://github.com/pese-git/cherrypick/wiki
|
documentation: https://github.com/pese-git/cherrypick/wiki
|
||||||
repository: https://github.com/pese-git/cherrypick
|
repository: https://github.com/pese-git/cherrypick/cherrypick_generator
|
||||||
issue_tracker: https://github.com/pese-git/cherrypick/issues
|
issue_tracker: https://github.com/pese-git/cherrypick/issues
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
@@ -10,12 +12,13 @@ environment:
|
|||||||
|
|
||||||
# Add regular dependencies here.
|
# Add regular dependencies here.
|
||||||
dependencies:
|
dependencies:
|
||||||
cherrypick_annotations: ^1.1.0-dev.0
|
cherrypick_annotations: ^1.1.0-dev.1
|
||||||
analyzer: ^6.7.0
|
analyzer: ^6.7.0
|
||||||
dart_style: ^2.3.7
|
dart_style: ^2.3.7
|
||||||
build: ^2.4.1
|
build: ^2.4.1
|
||||||
build_runner: ^2.4.13
|
build_runner: ^2.4.13
|
||||||
source_gen: ^1.5.0
|
source_gen: ^1.5.0
|
||||||
|
collection: ^1.18.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
lints: ^5.0.0
|
lints: ^5.0.0
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ packages:
|
|||||||
path: "../../cherrypick"
|
path: "../../cherrypick"
|
||||||
relative: true
|
relative: true
|
||||||
source: path
|
source: path
|
||||||
version: "2.2.0-dev.0"
|
version: "2.2.0-dev.1"
|
||||||
cherrypick_annotations:
|
cherrypick_annotations:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -146,14 +146,14 @@ packages:
|
|||||||
path: "../../cherrypick_flutter"
|
path: "../../cherrypick_flutter"
|
||||||
relative: true
|
relative: true
|
||||||
source: path
|
source: path
|
||||||
version: "1.1.2-dev.0"
|
version: "1.1.2-dev.1"
|
||||||
cherrypick_generator:
|
cherrypick_generator:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
path: "../../cherrypick_generator"
|
path: "../../cherrypick_generator"
|
||||||
relative: true
|
relative: true
|
||||||
source: path
|
source: path
|
||||||
version: "1.1.0-dev.0"
|
version: "1.1.0-dev.2"
|
||||||
clock:
|
clock:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ dependencies:
|
|||||||
cherrypick: ^2.2.0-dev.1
|
cherrypick: ^2.2.0-dev.1
|
||||||
cherrypick_flutter: ^1.1.2-dev.1
|
cherrypick_flutter: ^1.1.2-dev.1
|
||||||
|
|
||||||
cherrypick_annotations: ^1.1.0-dev.0
|
cherrypick_annotations: ^1.1.0-dev.1
|
||||||
|
|
||||||
cupertino_icons: ^1.0.8
|
cupertino_icons: ^1.0.8
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@ dev_dependencies:
|
|||||||
|
|
||||||
flutter_lints: ^5.0.0
|
flutter_lints: ^5.0.0
|
||||||
|
|
||||||
cherrypick_generator: ^1.1.0-dev.1
|
cherrypick_generator: ^1.1.0-dev.3
|
||||||
build_runner: ^2.4.13
|
build_runner: ^2.4.13
|
||||||
|
|
||||||
# For information on the generic Dart part of this file, see the
|
# For information on the generic Dart part of this file, see the
|
||||||
|
|||||||
35
examples/postly/lib/app.dart
Normal file
35
examples/postly/lib/app.dart
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import 'package:cherrypick/cherrypick.dart';
|
||||||
|
import 'package:cherrypick_annotations/cherrypick_annotations.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
|
||||||
|
import 'domain/repository/post_repository.dart';
|
||||||
|
import 'presentation/bloc/post_bloc.dart';
|
||||||
|
import 'router/app_router.dart';
|
||||||
|
|
||||||
|
part 'app.inject.cherrypick.g.dart';
|
||||||
|
|
||||||
|
@injectable()
|
||||||
|
class MyApp extends StatelessWidget with _$MyApp {
|
||||||
|
final _appRouter = AppRouter();
|
||||||
|
|
||||||
|
@named('repo')
|
||||||
|
@inject()
|
||||||
|
late final PostRepository repository;
|
||||||
|
|
||||||
|
MyApp({super.key}) {
|
||||||
|
_inject(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BlocProvider(
|
||||||
|
create: (_) => PostBloc(repository),
|
||||||
|
child: MaterialApp.router(
|
||||||
|
routeInformationParser: _appRouter.defaultRouteParser(),
|
||||||
|
routerDelegate: _appRouter.delegate(),
|
||||||
|
theme: ThemeData.light(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@ import '../data/network/json_placeholder_api.dart';
|
|||||||
import '../data/post_repository_impl.dart';
|
import '../data/post_repository_impl.dart';
|
||||||
import '../domain/repository/post_repository.dart';
|
import '../domain/repository/post_repository.dart';
|
||||||
|
|
||||||
part 'app_module.cherrypick.g.dart';
|
part 'app_module.module.cherrypick.g.dart';
|
||||||
|
|
||||||
@module()
|
@module()
|
||||||
abstract class AppModule extends Module {
|
abstract class AppModule extends Module {
|
||||||
|
|||||||
@@ -1,36 +1,9 @@
|
|||||||
import 'package:cherrypick/cherrypick.dart';
|
import 'package:cherrypick/cherrypick.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:postly/app.dart';
|
||||||
import 'di/app_module.dart';
|
import 'di/app_module.dart';
|
||||||
import 'domain/repository/post_repository.dart';
|
|
||||||
import 'presentation/bloc/post_bloc.dart';
|
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
||||||
import 'router/app_router.dart';
|
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
final scope = CherryPick.openRootScope();
|
CherryPick.openRootScope().installModules([$AppModule()]);
|
||||||
scope.installModules([$AppModule()]);
|
runApp(MyApp());
|
||||||
|
|
||||||
runApp(MyApp(scope: scope));
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
|
||||||
final Scope scope;
|
|
||||||
final _appRouter = AppRouter();
|
|
||||||
|
|
||||||
MyApp({super.key, required this.scope});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
// Получаем репозиторий через injector
|
|
||||||
final repository = scope.resolve<PostRepository>(named: 'repo');
|
|
||||||
|
|
||||||
return BlocProvider(
|
|
||||||
create: (_) => PostBloc(repository),
|
|
||||||
child: MaterialApp.router(
|
|
||||||
routeInformationParser: _appRouter.defaultRouteParser(),
|
|
||||||
routerDelegate: _appRouter.delegate(),
|
|
||||||
theme: ThemeData.light(),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ packages:
|
|||||||
path: "../../cherrypick"
|
path: "../../cherrypick"
|
||||||
relative: true
|
relative: true
|
||||||
source: path
|
source: path
|
||||||
version: "2.2.0-dev.0"
|
version: "2.2.0-dev.1"
|
||||||
cherrypick_annotations:
|
cherrypick_annotations:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -170,7 +170,7 @@ packages:
|
|||||||
path: "../../cherrypick_generator"
|
path: "../../cherrypick_generator"
|
||||||
relative: true
|
relative: true
|
||||||
source: path
|
source: path
|
||||||
version: "1.1.0-dev.0"
|
version: "1.1.0-dev.2"
|
||||||
clock:
|
clock:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ dependencies:
|
|||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|
||||||
cherrypick: ^2.2.0-dev.1
|
cherrypick: ^2.2.0-dev.1
|
||||||
cherrypick_annotations: ^1.1.0-dev.0
|
cherrypick_annotations: ^1.1.0-dev.1
|
||||||
|
|
||||||
dio: ^5.4.0
|
dio: ^5.4.0
|
||||||
retrofit: ^4.0.3
|
retrofit: ^4.0.3
|
||||||
@@ -30,7 +30,7 @@ dev_dependencies:
|
|||||||
|
|
||||||
flutter_lints: ^5.0.0
|
flutter_lints: ^5.0.0
|
||||||
|
|
||||||
cherrypick_generator: ^1.1.0-dev.1
|
cherrypick_generator: ^1.1.0-dev.3
|
||||||
build_runner: 2.4.13
|
build_runner: 2.4.13
|
||||||
|
|
||||||
retrofit_generator: ^9.1.5
|
retrofit_generator: ^9.1.5
|
||||||
|
|||||||
Reference in New Issue
Block a user