Skip to content

Commit 00a98b8

Browse files
authored
Merge pull request #709 from Flutterando/fix_inject
fix: Inject.get should return instance.
2 parents 1ce79b6 + 65d8490 commit 00a98b8

File tree

18 files changed

+105
-82
lines changed

18 files changed

+105
-82
lines changed

flutter_modular/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## [5.0.1] - 2022-04-22
2+
- Fix: Inject.get should return instance.
3+
14
## [5.0.0] - 2022-04-21
25
- Support Flutter 3.0.0
36
- [BREAK CHANGE]: Removed `MaterialApp.modular()` and `Cupertino().modular()`.

flutter_modular/lib/flutter_modular.dart

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,24 @@ import 'src/presenter/navigation/modular_router_delegate.dart';
1212
import 'src/presenter/navigation/router_outlet_delegate.dart';
1313

1414
export 'package:flutter_modular_annotations/flutter_modular_annotations.dart';
15+
export 'package:modular_core/modular_core.dart' show ModularRoute, Disposable, ReassembleMixin;
16+
1517
export 'src/presenter/guards/route_guard.dart';
1618
export 'src/presenter/models/bind.dart';
1719
export 'src/presenter/models/child_route.dart';
18-
export 'src/presenter/models/module_route.dart';
19-
export 'src/presenter/models/wildcard_route.dart';
20-
export 'src/presenter/models/redirect_to_route.dart';
2120
export 'src/presenter/models/modular_args.dart';
21+
export 'src/presenter/models/modular_navigator.dart';
2222
export 'src/presenter/models/module.dart';
23+
export 'src/presenter/models/module_route.dart';
24+
export 'src/presenter/models/redirect_to_route.dart';
2325
export 'src/presenter/models/route.dart';
24-
export 'src/presenter/models/modular_navigator.dart';
25-
export 'src/presenter/widgets/modular_app.dart';
26-
export 'src/presenter/widgets/navigation_listener.dart';
27-
export 'src/presenter/widgets/widget_module.dart';
26+
export 'src/presenter/models/wildcard_route.dart';
2827
export 'src/presenter/navigation/transitions/page_transition.dart';
2928
export 'src/presenter/navigation/transitions/transitions.dart';
29+
export 'src/presenter/widgets/modular_app.dart';
3030
export 'src/presenter/widgets/modular_state.dart';
31-
export 'package:modular_core/modular_core.dart'
32-
show ModularRoute, Disposable, ReassembleMixin;
31+
export 'src/presenter/widgets/navigation_listener.dart';
32+
export 'src/presenter/widgets/widget_module.dart';
3333

3434
IModularBase? _modular;
3535

@@ -53,11 +53,7 @@ void cleanGlobals() {
5353

5454
extension InjectorExtends on Injector {
5555
/// get arguments
56-
ModularArguments get args => injector
57-
.get<GetArguments>()
58-
.value
59-
.call()
60-
.getOrElse((l) => ModularArguments.empty());
56+
ModularArguments get args => injector.get<GetArguments>().call().getOrElse((l) => ModularArguments.empty());
6157
}
6258

6359
/// It acts as a Nested Browser that will be populated by the children of this route.
@@ -90,11 +86,9 @@ class RouterOutletState extends State<RouterOutlet> {
9086
void didChangeDependencies() {
9187
super.didChangeDependencies();
9288
final modal = (ModalRoute.of(context)?.settings as ModularPage);
93-
delegate ??= RouterOutletDelegate(modal.route.uri.toString(),
94-
injector.get<ModularRouterDelegate>().value, navigatorKey);
89+
delegate ??= RouterOutletDelegate(modal.route.uri.toString(), injector.get<ModularRouterDelegate>(), navigatorKey);
9590
final router = Router.of(context);
96-
_backButtonDispatcher =
97-
router.backButtonDispatcher!.createChildBackButtonDispatcher();
91+
_backButtonDispatcher = router.backButtonDispatcher!.createChildBackButtonDispatcher();
9892
}
9993

10094
@override

flutter_modular/lib/src/infra/services/bind_service_impl.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import 'package:modular_core/modular_core.dart';
2+
23
import '../../domain/errors/errors.dart';
3-
import '../../shared/either.dart';
44
import '../../domain/services/bind_service.dart';
5+
import '../../shared/either.dart';
56

67
class BindServiceImpl extends BindService {
78
final Injector injector;
@@ -17,7 +18,7 @@ class BindServiceImpl extends BindService {
1718
@override
1819
Either<ModularError, BindEntry<T>> getBind<T extends Object>() {
1920
try {
20-
final result = injector.get<T>();
21+
final result = injector.getBind<T>();
2122
return right(result);
2223
} on BindNotFound catch (e, s) {
2324
return left(BindNotFoundException('$T not found.', s));

flutter_modular/lib/src/presenter/widgets/widget_module.dart

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import 'package:flutter/widgets.dart';
2+
import 'package:modular_core/modular_core.dart';
3+
24
import '../../domain/usecases/bind_module.dart';
35
import '../../domain/usecases/unbind_module.dart';
46
import '../../flutter_modular_module.dart';
57
import '../models/bind.dart';
68
import '../models/module.dart';
7-
import 'package:modular_core/modular_core.dart';
89

910
abstract class WidgetModule extends StatelessWidget implements BindContextImpl {
1011
Widget get view;
@@ -35,12 +36,10 @@ abstract class WidgetModule extends StatelessWidget implements BindContextImpl {
3536
final List<Module> imports = const [];
3637

3738
@override
38-
List<BindEntry> get instanciatedSingletons =>
39-
_fakeModule.instanciatedSingletons;
39+
List<BindEntry> get instanciatedSingletons => _fakeModule.instanciatedSingletons;
4040

4141
@override
42-
void instantiateSingletonBinds(
43-
List<BindEntry<Object>> singletons, Injector injector) {
42+
void instantiateSingletonBinds(List<BindEntry<Object>> singletons, Injector injector) {
4443
_fakeModule.instantiateSingletonBinds(singletons, injector);
4544
}
4645

@@ -67,8 +66,7 @@ abstract class WidgetModule extends StatelessWidget implements BindContextImpl {
6766
}
6867

6968
@override
70-
void changeBinds(List<BindContract<Object>> newBinds) =>
71-
_fakeModule.changeBinds(newBinds);
69+
void changeBinds(List<BindContract<Object>> newBinds) => _fakeModule.changeBinds(newBinds);
7270

7371
@override
7472
// ignore: invalid_use_of_visible_for_testing_member
@@ -86,19 +84,17 @@ class ModularProvider<T extends BindContext> extends StatefulWidget {
8684
final BindContext module;
8785
final Widget child;
8886

89-
const ModularProvider({Key? key, required this.module, required this.child})
90-
: super(key: key);
87+
const ModularProvider({Key? key, required this.module, required this.child}) : super(key: key);
9188

9289
@override
9390
_ModularProviderState createState() => _ModularProviderState<T>();
9491
}
9592

96-
class _ModularProviderState<T extends BindContext>
97-
extends State<ModularProvider> {
93+
class _ModularProviderState<T extends BindContext> extends State<ModularProvider> {
9894
@override
9995
void initState() {
10096
super.initState();
101-
injector.get<BindModule>().value.call(widget.module);
97+
injector.get<BindModule>().call(widget.module);
10298
}
10399

104100
@override
@@ -109,6 +105,6 @@ class _ModularProviderState<T extends BindContext>
109105
@override
110106
void dispose() {
111107
super.dispose();
112-
injector.get<UnbindModule>().value.call<T>();
108+
injector.get<UnbindModule>().call<T>();
113109
}
114110
}

flutter_modular/pubspec.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
name: flutter_modular
22
description: Smart project structure with dependency injection and route management
3-
version: 5.0.0
3+
version: 5.0.1
44
homepage: https://github.com/Flutterando/modular
55

66
environment:
77
sdk: ">=2.12.0 <3.0.0"
88

99
dependencies:
1010
flutter_modular_annotations: ^0.0.2
11-
modular_core: ">=2.0.0 <3.0.0"
11+
modular_core: ">=2.0.1 <3.0.0"
1212
meta: ">=1.3.0 <2.0.0"
1313
flutter:
1414
sdk: flutter
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import 'package:flutter_modular/src/presenter/modular_base.dart';
21
import 'package:flutter_modular/src/flutter_modular_module.dart';
2+
import 'package:flutter_modular/src/presenter/modular_base.dart';
33
import 'package:flutter_test/flutter_test.dart';
44

55
void main() {
66
test('resolver injection (ModularBase)', () {
7-
expect(injector.get<IModularBase>().value, isA<ModularBase>());
7+
expect(injector.get<IModularBase>(), isA<ModularBase>());
88
});
99
}
Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import 'package:flutter_modular/flutter_modular.dart';
2-
import 'package:mocktail/mocktail.dart';
3-
import 'package:modular_core/modular_core.dart';
4-
import 'package:flutter_modular/src/shared/either.dart';
52
import 'package:flutter_modular/src/domain/errors/errors.dart';
63
import 'package:flutter_modular/src/infra/services/bind_service_impl.dart';
4+
import 'package:flutter_modular/src/shared/either.dart';
75
import 'package:flutter_test/flutter_test.dart';
6+
import 'package:mocktail/mocktail.dart';
7+
import 'package:modular_core/modular_core.dart';
88

99
import '../../mocks/mocks.dart';
1010

@@ -14,16 +14,12 @@ void main() {
1414

1515
group('getBind', () {
1616
test('should get bind', () {
17-
when(() => injector.get<String>())
18-
.thenReturn(BindEntry(bind: Bind<String>((i) => ''), value: 'test'));
19-
expect(
20-
service.getBind<String>().map((r) => r.value).getOrElse((left) => ''),
21-
'test');
17+
when(() => injector.getBind<String>()).thenReturn(BindEntry(bind: Bind<String>((i) => ''), value: 'test'));
18+
expect(service.getBind<String>().map((r) => r.value).getOrElse((left) => ''), 'test');
2219
});
2320
test('should throw error not found bind', () {
24-
when(() => injector.get<String>()).thenThrow(BindNotFound('String'));
25-
expect(
26-
service.getBind<String>().fold(id, id), isA<BindNotFoundException>());
21+
when(() => injector.getBind<String>()).thenThrow(BindNotFound('String'));
22+
expect(service.getBind<String>().fold(id, id), isA<BindNotFoundException>());
2723
});
2824
});
2925

@@ -37,8 +33,7 @@ void main() {
3733
group('releaseScopedBinds', () {
3834
test('should return true', () {
3935
when(() => injector.removeScopedBinds());
40-
expect(
41-
service.releaseScopedBinds().getOrElse((left) => throw left), unit);
36+
expect(service.releaseScopedBinds().getOrElse((left) => throw left), unit);
4237
});
4338
});
4439
}

modular_core/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## 2.0.1 - 2022/05/12
2+
* Fix: Inject.get should return instance
3+
14
## 2.0.0 - 2022/05/11
25
* Remove `setDisposeResolver`.
36
* Apply `BindContract.onDispose` of `modular_interface`.

modular_core/lib/src/di/bind_context.dart

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ abstract class BindContextImpl implements BindContext {
2525

2626
@override
2727
@visibleForTesting
28-
List<BindContract> getProcessBinds() => _binds.where((element) => !element.export).toList();
28+
List<BindContract> getProcessBinds() =>
29+
_binds.where((element) => !element.export).toList();
2930
@override
3031
void changeBinds(List<BindContract> newBinds) {
3132
_binds.removeWhere((element) => !element.alwaysSerialized);
@@ -52,7 +53,9 @@ abstract class BindContextImpl implements BindContext {
5253
return _singletonBinds[type]!.cast<T>();
5354
}
5455

55-
var bind = getProcessBinds().firstWhere((b) => b.factoryFunction is T Function(Injector), orElse: () => BindEmpty());
56+
var bind = getProcessBinds().firstWhere(
57+
(b) => b.factoryFunction is T Function(Injector),
58+
orElse: () => BindEmpty());
5659
if (bind is BindEmpty) {
5760
return null;
5861
}
@@ -108,16 +111,19 @@ abstract class BindContextImpl implements BindContext {
108111
Future<void> isReady() async {
109112
if (_mutableValue.isReadyFlag) return;
110113
_mutableValue.isReadyFlag = true;
111-
final asyncBindList = getProcessBinds().whereType<AsyncBindContract>().toList();
114+
final asyncBindList =
115+
getProcessBinds().whereType<AsyncBindContract>().toList();
112116
for (var bind in asyncBindList) {
113117
final resolvedBind = await bind.convertToBind();
114118
_binds.insert(0, resolvedBind);
115119
}
116120
}
117121

118122
@mustCallSuper
119-
void instantiateSingletonBinds(List<BindEntry> singletons, Injector injector) {
120-
final filteredList = getProcessBinds().where((bind) => !bind.isLazy && !_containBind(singletons, bind));
123+
void instantiateSingletonBinds(
124+
List<BindEntry> singletons, Injector injector) {
125+
final filteredList = getProcessBinds()
126+
.where((bind) => !bind.isLazy && !_containBind(singletons, bind));
121127
for (final bindElement in filteredList) {
122128
var b = bindElement.factoryFunction(injector);
123129
if (!_singletonBinds.containsKey(b.runtimeType)) {
@@ -131,15 +137,19 @@ abstract class BindContextImpl implements BindContext {
131137
}
132138

133139
bool _containBind(List<BindEntry> singletons, BindContract bind) {
134-
return singletons.indexWhere((element) => element.bind.factoryFunction == bind.factoryFunction) != -1;
140+
return singletons.indexWhere((element) =>
141+
element.bind.factoryFunction == bind.factoryFunction) !=
142+
-1;
135143
}
136144

137145
Type _getInjectType<B>() {
138146
var foundType = B;
139147

140148
for (var singleton in _singletonBinds.values) {
141149
if (singleton.value is B) {
142-
foundType = _singletonBinds.entries.firstWhere((map) => map.value.value == singleton.value).key;
150+
foundType = _singletonBinds.entries
151+
.firstWhere((map) => map.value.value == singleton.value)
152+
.key;
143153
break;
144154
}
145155
}

modular_core/lib/src/di/injector.dart

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1+
import 'package:characters/characters.dart';
12
import 'package:meta/meta.dart';
2-
import 'reassemble_mixin.dart';
33
import 'package:modular_interfaces/modular_interfaces.dart';
4+
45
import 'bind_context.dart';
6+
import 'reassemble_mixin.dart';
57
import 'resolvers.dart';
6-
import 'package:characters/characters.dart';
78

89
class InjectorImpl<T> extends Injector<T> {
910
final _allBindContexts = <Type, BindContext>{};
1011

1112
@override
12-
BindEntry<B> get<B extends Object>() {
13+
BindEntry<B> getBind<B extends Object>() {
1314
BindEntry<B>? entry;
1415

1516
for (var module in _allBindContexts.values.toList().reversed) {
@@ -26,9 +27,13 @@ class InjectorImpl<T> extends Injector<T> {
2627
return entry;
2728
}
2829

30+
@override
31+
B get<B extends Object>() => getBind<B>().value;
32+
2933
@override
3034
@mustCallSuper
31-
bool isModuleAlive<B extends BindContext>() => _allBindContexts.containsKey(_getType<B>());
35+
bool isModuleAlive<B extends BindContext>() =>
36+
_allBindContexts.containsKey(_getType<B>());
3237

3338
@override
3439
@mustCallSuper
@@ -46,7 +51,8 @@ class InjectorImpl<T> extends Injector<T> {
4651
final typeModule = module.runtimeType;
4752
if (!_allBindContexts.containsKey(typeModule)) {
4853
_allBindContexts[typeModule] = module;
49-
(_allBindContexts[typeModule] as BindContextImpl).instantiateSingletonBinds(_getAllSingletons(), this);
54+
(_allBindContexts[typeModule] as BindContextImpl)
55+
.instantiateSingletonBinds(_getAllSingletons(), this);
5056
(_allBindContexts[typeModule] as BindContextImpl).tags.add(tag);
5157
debugPrint("-- $typeModule INITIALIZED");
5258
} else {
@@ -107,7 +113,9 @@ class InjectorImpl<T> extends Injector<T> {
107113

108114
@override
109115
void updateBinds(BindContext context) {
110-
final key = _allBindContexts.keys.firstWhere((key) => key.toString() == context.runtimeType.toString(), orElse: () => _KeyNotFound);
116+
final key = _allBindContexts.keys.firstWhere(
117+
(key) => key.toString() == context.runtimeType.toString(),
118+
orElse: () => _KeyNotFound);
111119
if (key == _KeyNotFound) {
112120
return;
113121
}

0 commit comments

Comments
 (0)