diff --git a/flutter_modular/lib/src/inject/bind.dart b/flutter_modular/lib/src/inject/bind.dart index 01374d6d..11b3c16d 100644 --- a/flutter_modular/lib/src/inject/bind.dart +++ b/flutter_modular/lib/src/inject/bind.dart @@ -10,7 +10,9 @@ class Bind { ///When 'false', the object is instantiated along with the module. final bool lazy; - Bind(this.inject, {this.singleton = true, this.lazy = true}) + final String alias; + + Bind(this.inject, {this.singleton = true, this.lazy = true, this.alias }) : assert((singleton || lazy), r"'singleton' can't be false if 'lazy' is also false"); } diff --git a/flutter_modular/lib/src/inject/inject.dart b/flutter_modular/lib/src/inject/inject.dart index 89a1ab9b..03e210a5 100644 --- a/flutter_modular/lib/src/inject/inject.dart +++ b/flutter_modular/lib/src/inject/inject.dart @@ -10,7 +10,7 @@ class Inject { @deprecated Map params = {}; final String tag; - final List typesInRequest; + final List typesInRequest; Inject({this.params, this.tag, this.typesInRequest}); diff --git a/flutter_modular/lib/src/interfaces/child_module.dart b/flutter_modular/lib/src/interfaces/child_module.dart index a89c96ae..af0c4576 100644 --- a/flutter_modular/lib/src/interfaces/child_module.dart +++ b/flutter_modular/lib/src/interfaces/child_module.dart @@ -18,18 +18,19 @@ abstract class ChildModule { final List paths = []; - final Map _singletonBinds = {}; + final Map _singletonBinds = {}; - T getBind(Map params, {List typesInRequest}) { + T getBind(Map params, {List typesInRequest, String alias}) { T bindValue; - var type = _getInjectType(); + var type = alias ?? _getInjectType().toString(); if (_singletonBinds.containsKey(type)) { bindValue = _singletonBinds[type]; return bindValue; } - var bind = _binds.firstWhere((b) => b.inject is T Function(Inject), + var bind = _binds.firstWhere((b) => b.alias == type || ( b.alias == null && T.toString() != 'dynamic' && b.inject is T Function(Inject)), orElse: () => null); + if (bind == null) { typesInRequest.remove(type); return null; @@ -51,7 +52,7 @@ ${typesInRequest.join('\n')} bindValue = bind.inject(Inject(params: params, typesInRequest: typesInRequest)); if (bind.singleton) { - _singletonBinds[type] = bindValue; + _singletonBinds[bind.alias ?? type] = bindValue; } typesInRequest.remove(type); @@ -105,7 +106,7 @@ ${typesInRequest.join('\n')} for (final bindElement in _binds) { if (!bindElement.lazy) { var b = bindElement.inject(Inject()); - _singletonBinds[b.runtimeType] = b; + _singletonBinds[bindElement.alias ?? b.runtimeType.toString()] = b; } } } diff --git a/flutter_modular/lib/src/modular_base.dart b/flutter_modular/lib/src/modular_base.dart index 95f604d5..72679df7 100644 --- a/flutter_modular/lib/src/modular_base.dart +++ b/flutter_modular/lib/src/modular_base.dart @@ -169,9 +169,10 @@ class Modular { static B get( {Map params, String module, - List typesInRequest, + List typesInRequest, + String alias, B defaultValue}) { - if (B.toString() == 'dynamic') { + if (B.toString() == 'dynamic' && alias == null) { throw ModularError('not allow for dynamic values'); } @@ -179,7 +180,7 @@ class Modular { if (module != null) { return _getInjectableObject(module, - params: params, typesInRequest: typesInRequest); + params: params, typesInRequest: typesInRequest, alias: alias); } for (var key in _injectMap.keys) { @@ -187,6 +188,7 @@ class Modular { params: params, disableError: true, typesInRequest: typesInRequest, + alias: alias, checkKey: false); if (value != null) { return value; @@ -203,15 +205,16 @@ class Modular { static B _getInjectableObject(String tag, {Map params, bool disableError = false, - List typesInRequest, + List typesInRequest, + String alias, bool checkKey = true}) { B value; if (!checkKey) { value = - _injectMap[tag].getBind(params, typesInRequest: typesInRequest); + _injectMap[tag].getBind(params, typesInRequest: typesInRequest, alias: alias); } else if (_injectMap.containsKey(tag)) { value = - _injectMap[tag].getBind(params, typesInRequest: typesInRequest); + _injectMap[tag].getBind(params, typesInRequest: typesInRequest, alias: alias); } if (value == null && !disableError) { throw ModularError('${B.toString()} not found in module $tag'); diff --git a/flutter_modular/lib/src/widgets/module_widget.dart b/flutter_modular/lib/src/widgets/module_widget.dart index 18af9c93..29ffd6bf 100644 --- a/flutter_modular/lib/src/widgets/module_widget.dart +++ b/flutter_modular/lib/src/widgets/module_widget.dart @@ -30,8 +30,8 @@ abstract class WidgetModule extends StatelessWidget implements ChildModule { } @override - T getBind(Map params, {List typesInRequest}) { - return _fakeModule.getBind(params, typesInRequest: typesInRequest); + T getBind(Map params, {List typesInRequest, String alias}) { + return _fakeModule.getBind(params, typesInRequest: typesInRequest, alias: alias); } @override diff --git a/flutter_modular/lib/src/widgets/widget_module.dart b/flutter_modular/lib/src/widgets/widget_module.dart index 18af9c93..29ffd6bf 100644 --- a/flutter_modular/lib/src/widgets/widget_module.dart +++ b/flutter_modular/lib/src/widgets/widget_module.dart @@ -30,8 +30,8 @@ abstract class WidgetModule extends StatelessWidget implements ChildModule { } @override - T getBind(Map params, {List typesInRequest}) { - return _fakeModule.getBind(params, typesInRequest: typesInRequest); + T getBind(Map params, {List typesInRequest, String alias}) { + return _fakeModule.getBind(params, typesInRequest: typesInRequest, alias: alias); } @override diff --git a/flutter_modular/test/app/app_module.dart b/flutter_modular/test/app/app_module.dart index 0eee20a6..1bdcf7b1 100644 --- a/flutter_modular/test/app/app_module.dart +++ b/flutter_modular/test/app/app_module.dart @@ -9,12 +9,14 @@ import 'modules/home/home_module.dart'; import 'modules/product/product_module.dart'; import 'shared/ilocal_repository.dart'; import 'shared/local_storage_shared.dart'; +import 'shared/local_storage_shared_alias.dart'; class AppModule extends MainModule { @override List get binds => [ Bind((i) => AppBloc()), Bind((i) => LocalStorageSharePreference()), + Bind((i) => LocalStorageSharePreferenceAlias(),alias: 'test'), ]; @override diff --git a/flutter_modular/test/app/shared/local_storage_shared_alias.dart b/flutter_modular/test/app/shared/local_storage_shared_alias.dart new file mode 100644 index 00000000..1bd6b032 --- /dev/null +++ b/flutter_modular/test/app/shared/local_storage_shared_alias.dart @@ -0,0 +1,18 @@ +import 'ilocal_repository.dart'; + +class LocalStorageSharePreferenceAlias implements ILocalStorage { + @override + Future delete(String key) { + return null; + } + + @override + Future get(String key) { + return null; + } + + @override + Future put(String key, String value) { + return null; + } +} diff --git a/flutter_modular/test/bind_test.dart b/flutter_modular/test/bind_test.dart index 79b57f65..fceb602a 100644 --- a/flutter_modular/test/bind_test.dart +++ b/flutter_modular/test/bind_test.dart @@ -8,6 +8,7 @@ void main() { expect(Bind((i) => 'obs', singleton: true, lazy: true), isA()); expect(Bind((i) => 'obs', singleton: true, lazy: false), isA()); expect(Bind((i) => 'obs', singleton: false, lazy: true), isA()); + expect(Bind((i) => 'obs', singleton: false, lazy: true, alias: 'test'), isA()); }); test('error', () { expect( diff --git a/flutter_modular/test/modular_inject_test.dart b/flutter_modular/test/modular_inject_test.dart index df1d2ee7..e2ee1b36 100644 --- a/flutter_modular/test/modular_inject_test.dart +++ b/flutter_modular/test/modular_inject_test.dart @@ -10,6 +10,7 @@ import 'app/modules/home/home_module.dart'; import 'app/shared/app_info.state.dart'; import 'app/shared/ilocal_repository.dart'; import 'app/shared/local_storage_shared.dart'; +import 'app/shared/local_storage_shared_alias.dart'; void main() { setUpAll(() { @@ -23,11 +24,15 @@ void main() { test('Get withless module', () { expect(Modular.get(), isA()); expect(Modular.get(), isA()); + expect(Modular.get(alias: 'test'), isA()); + }); test('Get with module', () { expect(Modular.get(module: 'AppModule'), isA()); expect(Modular.get(module: 'HomeModule'), isA()); + expect(Modular.get(module: 'AppModule', alias: 'test'), isA()); + }); test('Inject not found with module', () {