diff --git a/cherrypick_annotations/lib/src/inject.dart b/cherrypick_annotations/lib/src/inject.dart index d5d7edd..194bfc1 100644 --- a/cherrypick_annotations/lib/src/inject.dart +++ b/cherrypick_annotations/lib/src/inject.dart @@ -11,6 +11,9 @@ // limitations under the License. // +import 'package:meta/meta.dart'; + +@experimental // ignore: camel_case_types final class inject { const inject(); diff --git a/cherrypick_annotations/lib/src/injectable.dart b/cherrypick_annotations/lib/src/injectable.dart index e242ed8..bcc6281 100644 --- a/cherrypick_annotations/lib/src/injectable.dart +++ b/cherrypick_annotations/lib/src/injectable.dart @@ -11,6 +11,9 @@ // limitations under the License. // +import 'package:meta/meta.dart'; + +@experimental // ignore: camel_case_types final class injectable { const injectable(); diff --git a/cherrypick_annotations/lib/src/scope.dart b/cherrypick_annotations/lib/src/scope.dart index b69b7cb..ba15772 100644 --- a/cherrypick_annotations/lib/src/scope.dart +++ b/cherrypick_annotations/lib/src/scope.dart @@ -11,6 +11,9 @@ // limitations under the License. // +import 'package:meta/meta.dart'; + +@experimental // ignore: camel_case_types final class scope { final String? name; diff --git a/cherrypick_generator/lib/inject_generator.dart b/cherrypick_generator/lib/inject_generator.dart index 8292dda..000fe51 100644 --- a/cherrypick_generator/lib/inject_generator.dart +++ b/cherrypick_generator/lib/inject_generator.dart @@ -1,5 +1,6 @@ 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'; @@ -44,18 +45,32 @@ class InjectGenerator extends GeneratorForAnnotation { } } - final String fieldType = field.type.getDisplayString(); + // --- Фикс: определяем resolveAsync для Future --- + final DartType type = field.type; + String genericType; + String resolveMethod; + if (type.isDartAsyncFuture) { + // Если поле Future + final typeArg = (type as ParameterizedType).typeArguments.first; + genericType = typeArg.getDisplayString(); + resolveMethod = 'resolveAsync<$genericType>'; + } else { + genericType = type.getDisplayString(); + resolveMethod = 'resolve<$genericType>'; + } + + // Вызываем openScope или openRootScope String accessor = (scopeName != null && scopeName.isNotEmpty) - ? "CherryPick.openScope(scopeName: '$scopeName').resolve" - : "CherryPick.openRootScope().resolve"; + ? "CherryPick.openScope(scopeName: '$scopeName').$resolveMethod" + : "CherryPick.openRootScope().$resolveMethod"; - String generic = fieldType != 'dynamic' ? '<$fieldType>' : ''; + // Аргументы resolve String params = (namedValue != null && namedValue.isNotEmpty) ? "(named: '$namedValue')" : '()'; - buffer.writeln(" instance.${field.name} = $accessor$generic$params;"); + buffer.writeln(" instance.${field.name} = $accessor$params;"); } buffer.writeln(' }'); diff --git a/examples/postly/lib/app.dart b/examples/postly/lib/app.dart index 218b890..260850c 100644 --- a/examples/postly/lib/app.dart +++ b/examples/postly/lib/app.dart @@ -13,24 +13,16 @@ part 'app.inject.cherrypick.g.dart'; class MyApp extends StatelessWidget with _$MyApp { final _appRouter = AppRouter(); - @scope('authZone') - @inject() - late final String text; - - @scope('authZone') - @named('timeout') - @inject() - late final int timeout; - @named('repo') @inject() late final PostRepository repository; - MyApp({super.key}); + MyApp({super.key}) { + _inject(this); + } @override Widget build(BuildContext context) { - _inject(this); return BlocProvider( create: (_) => PostBloc(repository), child: MaterialApp.router(