implement inject generator

This commit is contained in:
Sergey Penkovsky
2025-05-23 15:26:09 +03:00
parent 9c42ba4cef
commit 8438697107
5 changed files with 32 additions and 16 deletions

View File

@@ -11,6 +11,9 @@
// limitations under the License.
//
import 'package:meta/meta.dart';
@experimental
// ignore: camel_case_types
final class inject {
const inject();

View File

@@ -11,6 +11,9 @@
// limitations under the License.
//
import 'package:meta/meta.dart';
@experimental
// ignore: camel_case_types
final class injectable {
const injectable();

View File

@@ -11,6 +11,9 @@
// limitations under the License.
//
import 'package:meta/meta.dart';
@experimental
// ignore: camel_case_types
final class scope {
final String? name;

View File

@@ -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<ann.injectable> {
}
}
final String fieldType = field.type.getDisplayString();
// --- Фикс: определяем resolveAsync для Future<T> ---
final DartType type = field.type;
String genericType;
String resolveMethod;
if (type.isDartAsyncFuture) {
// Если поле Future<T>
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(' }');

View File

@@ -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(