import 'dart:async'; import 'package:cherrypick/cherrypick.dart'; class AppModule extends Module { @override void builder(Scope currentScope) { bind().withName("apiClientMock").toInstance(ApiClientMock()); bind().withName("apiClientImpl").toInstance(ApiClientImpl()); } } class FeatureModule extends Module { final bool isMock; FeatureModule({required this.isMock}); @override void builder(Scope currentScope) { // Using toProvideAsync for async initialization bind() .withName("networkRepo") .toProvideWithParams((params) async { print('REPO PARAMS: $params'); final client = await Future.delayed( Duration(milliseconds: 1000), () => currentScope.resolve( named: isMock ? "apiClientMock" : "apiClientImpl", ), ); return NetworkDataRepository(client); }).singleton(); // Asynchronous initialization of DataBloc bind().toProvide( () async { final repo = await currentScope.resolveAsync( named: "networkRepo", params: 'Some params', ); return DataBloc(repo); }, ); } } Future main() async { try { final scope = CherryPick.openRootScope().installModules([AppModule()]); final subScope = scope .openSubScope("featureScope") .installModules([FeatureModule(isMock: true)]); // Asynchronous instance resolution final dataBloc = await subScope.resolveAsync(); dataBloc.data.listen( (d) => print('Received data: $d'), onError: (e) => print('Error: $e'), onDone: () => print('DONE'), ); await dataBloc.fetchData(); } catch (e) { print('Error resolving dependency: $e'); } } class DataBloc { final DataRepository _dataRepository; final StreamController _dataController = StreamController.broadcast(); Stream get data => _dataController.stream; DataBloc(this._dataRepository); Future fetchData() async { try { _dataController.sink.add(await _dataRepository.getData()); } catch (e) { _dataController.sink.addError(e); } } void dispose() { _dataController.close(); } } abstract class DataRepository { Future getData(); } class NetworkDataRepository implements DataRepository { final ApiClient _apiClient; final _token = 'token'; NetworkDataRepository(this._apiClient); @override Future getData() async => await _apiClient.sendRequest( url: 'www.google.com', token: _token, requestBody: {'type': 'data'}); } abstract class ApiClient { Future sendRequest({String url, String token, Map requestBody}); } class ApiClientMock implements ApiClient { @override Future sendRequest({String? url, String? token, Map? requestBody}) async { return 'Local Data'; } } class ApiClientImpl implements ApiClient { @override Future sendRequest({String? url, String? token, Map? requestBody}) async { return 'Network data'; } }