From 8c3a0df452585814864a228db4ae2634d23be25a Mon Sep 17 00:00:00 2001 From: yarashevich_kv Date: Wed, 10 Aug 2022 17:23:54 +0300 Subject: [PATCH 1/2] Add parameter to provider --- example/bin/main.dart | 60 ++++++++++++++++++++++++++++--------------- lib/src/binding.dart | 23 ++++++++++++++++- lib/src/scope.dart | 12 ++++++--- 3 files changed, 71 insertions(+), 24 deletions(-) diff --git a/example/bin/main.dart b/example/bin/main.dart index bfe1504..553b401 100644 --- a/example/bin/main.dart +++ b/example/bin/main.dart @@ -22,15 +22,17 @@ class FeatureModule extends Module { .withName('networkRepo') .toProvide( () => NetworkDataRepository( - currentScope.resolve( - named: isMock ? 'apiClientMock' : 'apiClientImpl', - ), - ), - ) + currentScope.resolve( + named: isMock ? 'apiClientMock' : 'apiClientImpl', + ), + ), + ) .singleton(); - bind().toProvide( - () => DataBloc( + + bind().toProvideWithParam( + (param) => DataBloc( currentScope.resolve(named: 'networkRepo'), + param, ), ); } @@ -45,7 +47,7 @@ void main() async { .openSubScope('featureScope') .installModules([FeatureModule(isMock: true)]); - final dataBloc = subScope.resolve(); + final dataBloc = subScope.resolve(param: 'PARAMETER'); dataBloc.data.listen((d) => print('Received data: $d'), onError: (e) => print('Error: $e'), onDone: () => print('DONE')); @@ -58,11 +60,13 @@ class DataBloc { Stream get data => _dataController.stream; final StreamController _dataController = StreamController.broadcast(); - DataBloc(this._dataRepository); + final String param; + + DataBloc(this._dataRepository, this.param); Future fetchData() async { try { - _dataController.sink.add(await _dataRepository.getData()); + _dataController.sink.add(await _dataRepository.getData(param)); } catch (e) { _dataController.sink.addError(e); } @@ -74,7 +78,7 @@ class DataBloc { } abstract class DataRepository { - Future getData(); + Future getData(String param); } class NetworkDataRepository implements DataRepository { @@ -84,26 +88,42 @@ class NetworkDataRepository implements DataRepository { NetworkDataRepository(this._apiClient); @override - Future getData() async => await _apiClient.sendRequest( - url: 'www.google.com', token: _token, requestBody: {'type': 'data'}); + Future getData(String param) async => await _apiClient.sendRequest( + url: 'www.google.com', + token: _token, + requestBody: {'type': 'data'}, + param: param); } abstract class ApiClient { - Future sendRequest({@required String url, String token, Map requestBody}); + Future sendRequest({ + @required String url, + String token, + Map requestBody, + String param, + }); } class ApiClientMock implements ApiClient { @override - Future sendRequest( - {@required String? url, String? token, Map? requestBody}) async { - return 'Local Data'; + Future sendRequest({ + @required String? url, + String? token, + Map? requestBody, + String? param, + }) async { + return 'Local Data $param'; } } class ApiClientImpl implements ApiClient { @override - Future sendRequest( - {@required String? url, String? token, Map? requestBody}) async { - return 'Network data'; + Future sendRequest({ + @required String? url, + String? token, + Map? requestBody, + String? param, + }) async { + return 'Network data $param'; } } diff --git a/lib/src/binding.dart b/lib/src/binding.dart index 12807ef..14b165d 100644 --- a/lib/src/binding.dart +++ b/lib/src/binding.dart @@ -11,7 +11,9 @@ /// limitations under the License. /// -enum Mode { SIMPLE, INSTANCE, PROVIDER_INSTANCE } +enum Mode { SIMPLE, INSTANCE, PROVIDER_INSTANCE, PROVIDER_WITH_PARAMS_INSTANCE } + +typedef ProviderWithParam = T Function(dynamic param); /// RU: Класс Binding настраивает параметры экземпляра. /// ENG: The Binding class configures the settings for the instance. @@ -22,6 +24,7 @@ class Binding { late String _name; T? _instance; T? Function()? _provider; + ProviderWithParam? _providerWithParam; late bool _isSingleton = false; late bool _isNamed = false; @@ -91,6 +94,16 @@ class Binding { return this; } + /// RU: Инициализация экземляпяра  через провайдер [value] c динамическим параметром. + /// ENG: Initialization instance via provider [value] with a dynamic param. + /// + /// return [Binding] + Binding toProvideWithParam(ProviderWithParam value) { + _mode = Mode.PROVIDER_WITH_PARAMS_INSTANCE; + _providerWithParam = value; + return this; + } + /// RU: Инициализация экземляпяра  как сингелтон [value]. /// ENG: Initialization instance as a singelton [value]. /// @@ -117,4 +130,12 @@ class Binding { } return _provider?.call(); } + + /// RU: Поиск экземпляра с параметром. + /// ENG: Resolve instance with param. + /// + /// return [T] + T? providerWithParam(dynamic param) { + return _providerWithParam?.call(param); + } } diff --git a/lib/src/scope.dart b/lib/src/scope.dart index 578b370..0e5aefc 100644 --- a/lib/src/scope.dart +++ b/lib/src/scope.dart @@ -86,8 +86,8 @@ class Scope { /// If you want to get [null] if the dependency cannot be found then use [tryResolve] instead /// return - returns an object of type [T] or [StateError] /// - T resolve({String? named}) { - var resolved = tryResolve(named: named); + T resolve({String? named, dynamic param}) { + var resolved = tryResolve(named: named, param: param); if (resolved != null) { return resolved; } else { @@ -99,7 +99,7 @@ class Scope { /// RU: Возвращает найденную зависимость типа [T] или null, если она не может быть найдена. /// ENG: Returns found dependency of type [T] or null if it cannot be found. /// - T? tryResolve({String? named}) { + T? tryResolve({String? named, dynamic param}) { // 1 Поиск зависимости по всем модулям текущего скоупа if (_modulesList.isNotEmpty) { for (var module in _modulesList) { @@ -112,6 +112,12 @@ class Scope { return binding.instance; case Mode.PROVIDER_INSTANCE: return binding.provider; + case Mode.PROVIDER_WITH_PARAMS_INSTANCE: + if (param == null) { + throw StateError( + 'Param is null. Maybe you forget pass it'); + } + return binding.providerWithParam(param); default: return null; } From e0f587462192671baaaa6826d63de1e2b10d8867 Mon Sep 17 00:00:00 2001 From: Sergey Penkovsky Date: Wed, 4 Jan 2023 11:03:29 +0300 Subject: [PATCH 2/2] refactored pr --- example/bin/main.dart | 16 ++++++++-------- lib/src/binding.dart | 15 ++++++++------- lib/src/scope.dart | 13 ++++++------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/example/bin/main.dart b/example/bin/main.dart index 553b401..c57e00f 100644 --- a/example/bin/main.dart +++ b/example/bin/main.dart @@ -22,15 +22,15 @@ class FeatureModule extends Module { .withName('networkRepo') .toProvide( () => NetworkDataRepository( - currentScope.resolve( - named: isMock ? 'apiClientMock' : 'apiClientImpl', - ), - ), - ) + currentScope.resolve( + named: isMock ? 'apiClientMock' : 'apiClientImpl', + ), + ), + ) .singleton(); - bind().toProvideWithParam( - (param) => DataBloc( + bind().toProvideWithParams( + (param) => DataBloc( currentScope.resolve(named: 'networkRepo'), param, ), @@ -47,7 +47,7 @@ void main() async { .openSubScope('featureScope') .installModules([FeatureModule(isMock: true)]); - final dataBloc = subScope.resolve(param: 'PARAMETER'); + final dataBloc = subScope.resolve(params: 'PARAMETER'); dataBloc.data.listen((d) => print('Received data: $d'), onError: (e) => print('Error: $e'), onDone: () => print('DONE')); diff --git a/lib/src/binding.dart b/lib/src/binding.dart index 14b165d..c1d98ce 100644 --- a/lib/src/binding.dart +++ b/lib/src/binding.dart @@ -13,7 +13,7 @@ enum Mode { SIMPLE, INSTANCE, PROVIDER_INSTANCE, PROVIDER_WITH_PARAMS_INSTANCE } -typedef ProviderWithParam = T Function(dynamic param); +typedef ProviderWithParams = T Function(dynamic params); /// RU: Класс Binding настраивает параметры экземпляра. /// ENG: The Binding class configures the settings for the instance. @@ -24,7 +24,7 @@ class Binding { late String _name; T? _instance; T? Function()? _provider; - ProviderWithParam? _providerWithParam; + ProviderWithParams? _providerWithParams; late bool _isSingleton = false; late bool _isNamed = false; @@ -98,9 +98,9 @@ class Binding { /// ENG: Initialization instance via provider [value] with a dynamic param. /// /// return [Binding] - Binding toProvideWithParam(ProviderWithParam value) { + Binding toProvideWithParams(ProviderWithParams value) { _mode = Mode.PROVIDER_WITH_PARAMS_INSTANCE; - _providerWithParam = value; + _providerWithParams = value; return this; } @@ -132,10 +132,11 @@ class Binding { } /// RU: Поиск экземпляра с параметром. - /// ENG: Resolve instance with param. + /// + /// ENG: Resolve instance with [params]. /// /// return [T] - T? providerWithParam(dynamic param) { - return _providerWithParam?.call(param); + T? providerWithParams(dynamic params) { + return _providerWithParams?.call(params); } } diff --git a/lib/src/scope.dart b/lib/src/scope.dart index 0e5aefc..66dfb94 100644 --- a/lib/src/scope.dart +++ b/lib/src/scope.dart @@ -86,8 +86,8 @@ class Scope { /// If you want to get [null] if the dependency cannot be found then use [tryResolve] instead /// return - returns an object of type [T] or [StateError] /// - T resolve({String? named, dynamic param}) { - var resolved = tryResolve(named: named, param: param); + T resolve({String? named, dynamic params}) { + var resolved = tryResolve(named: named, params: params); if (resolved != null) { return resolved; } else { @@ -99,7 +99,7 @@ class Scope { /// RU: Возвращает найденную зависимость типа [T] или null, если она не может быть найдена. /// ENG: Returns found dependency of type [T] or null if it cannot be found. /// - T? tryResolve({String? named, dynamic param}) { + T? tryResolve({String? named, dynamic params}) { // 1 Поиск зависимости по всем модулям текущего скоупа if (_modulesList.isNotEmpty) { for (var module in _modulesList) { @@ -113,11 +113,10 @@ class Scope { case Mode.PROVIDER_INSTANCE: return binding.provider; case Mode.PROVIDER_WITH_PARAMS_INSTANCE: - if (param == null) { - throw StateError( - 'Param is null. Maybe you forget pass it'); + if (params == null) { + throw StateError('Param is null. Maybe you forget pass it'); } - return binding.providerWithParam(param); + return binding.providerWithParams(params); default: return null; }