import 'package:riverpod/riverpod.dart'; import 'di_adapter.dart'; /// Унифицированный DIAdapter для Riverpod с поддержкой scopes и строгой типизацией. class RiverpodAdapter extends DIAdapter>> { ProviderContainer? _container; final Map> _namedProviders; final ProviderContainer? _parent; final bool _isSubScope; RiverpodAdapter({ ProviderContainer? container, Map>? providers, ProviderContainer? parent, bool isSubScope = false, }) : _container = container, _namedProviders = providers ?? >{}, _parent = parent, _isSubScope = isSubScope; @override void setupDependencies(void Function(Map> container) registration) { _container ??= _parent == null ? ProviderContainer() : ProviderContainer(parent: _parent); registration(_namedProviders); } @override T resolve({String? named}) { final key = named ?? T.toString(); final provider = _namedProviders[key]; if (provider == null) { throw Exception('Provider not found for $key'); } return _container!.read(provider) as T; } @override Future resolveAsync({String? named}) async { final key = named ?? T.toString(); final provider = _namedProviders[key]; if (provider == null) { throw Exception('Provider not found for $key'); } // Если это FutureProvider — используем .future if (provider.runtimeType.toString().contains('FutureProvider')) { return await _container!.read((provider as dynamic).future) as T; } return resolve(named: named); } @override void teardown() { _container?.dispose(); _container = null; _namedProviders.clear(); } @override RiverpodAdapter openSubScope(String name) { final newContainer = ProviderContainer(parent: _container); return RiverpodAdapter( container: newContainer, providers: Map.of(_namedProviders), parent: _container, isSubScope: true, ); } @override Future waitForAsyncReady() async { // Riverpod синхронный по умолчанию. return; } }