Skip to content

Commit d9f7485

Browse files
authored
Merge pull request #387 from ArtAhmetajCR/reviseCachedFactoryAssertions
Revise and improve cached factory handling with params
2 parents 954c600 + d118a07 commit d9f7485

File tree

2 files changed

+86
-4
lines changed

2 files changed

+86
-4
lines changed

lib/get_it_impl.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,8 @@ class _ServiceFactory<T extends Object, P1, P2> {
171171
/// returns an instance depending on the type of the registration if [async==false]
172172
T getObject(dynamic param1, dynamic param2) {
173173
assert(
174-
!(factoryType != _ServiceFactoryType.alwaysNew &&
174+
!(![_ServiceFactoryType.alwaysNew, _ServiceFactoryType.cachedFactory]
175+
.contains(factoryType) &&
175176
(param1 != null || param2 != null)),
176177
'You can only pass parameters to factories!',
177178
);
@@ -201,6 +202,8 @@ class _ServiceFactory<T extends Object, P1, P2> {
201202
param2 == lastParam2) {
202203
return weakReferenceInstance!.target!;
203204
} else {
205+
lastParam1 = param1 as P1?;
206+
lastParam2 = param2 as P2?;
204207
T newInstance;
205208
if (creationFunctionParam != null) {
206209
newInstance = creationFunctionParam!(param1 as P1, param2 as P2);
@@ -254,7 +257,8 @@ class _ServiceFactory<T extends Object, P1, P2> {
254257
/// if [dependsOn.isNotEmpty].
255258
Future<R> getObjectAsync<R>(dynamic param1, dynamic param2) async {
256259
assert(
257-
!(factoryType != _ServiceFactoryType.alwaysNew &&
260+
!(![_ServiceFactoryType.alwaysNew, _ServiceFactoryType.cachedFactory]
261+
.contains(factoryType) &&
258262
(param1 != null || param2 != null)),
259263
'You can only pass parameters to factories!',
260264
);
@@ -291,6 +295,8 @@ class _ServiceFactory<T extends Object, P1, P2> {
291295
return Future<R>.value(weakReferenceInstance!.target! as R);
292296
} else {
293297
if (creationFunctionParam != null) {
298+
lastParam1 = param1 as P1?;
299+
lastParam2 = param2 as P2?;
294300
return asyncCreationFunctionParam!(param1 as P1, param2 as P2)
295301
.then((value) {
296302
weakReferenceInstance = WeakReference(value);

test/get_it_test.dart

Lines changed: 78 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,13 @@ class TestClassDisposable extends TestBaseClass with Disposable {
3939

4040
class TestClass2 {}
4141

42-
class TestClassParam {
42+
class TestClassParam extends TestBaseClass {
4343
final String? param1;
4444
final int? param2;
4545

46-
TestClassParam({this.param1, this.param2});
46+
TestClassParam({this.param1, this.param2}) {
47+
constructorCounter++;
48+
}
4749
}
4850

4951
class TestClassDisposableWithDependency with Disposable {
@@ -216,6 +218,80 @@ void main() {
216218
GetIt.I.reset();
217219
});
218220

221+
test('register cached factory', () {
222+
final getIt = GetIt.instance;
223+
constructorCounter = 0;
224+
getIt.registerCachedFactory<TestBaseClass>(() => TestClass());
225+
final TestBaseClass instance1 = getIt<TestBaseClass>();
226+
expect(instance1 is TestClass, true);
227+
final instance2 = getIt.get<TestBaseClass>();
228+
expect(getIt.isRegistered<TestBaseClass>(), true);
229+
expect(instance1, instance2);
230+
expect(constructorCounter, 1);
231+
});
232+
233+
test('register cached factory with one param ', () {
234+
final getIt = GetIt.instance;
235+
constructorCounter = 0;
236+
getIt.registerCachedFactoryParam<TestClassParam, String, void>(
237+
(s, _) => TestClassParam(param1: s),
238+
);
239+
final instance1 = getIt<TestClassParam>(param1: 'abc');
240+
final instance2 = getIt<TestClassParam>(param1: 'abc');
241+
expect(instance1 is TestClassParam, true);
242+
expect(instance1.param1, 'abc');
243+
expect(instance1, instance2);
244+
expect(constructorCounter, 1);
245+
});
246+
247+
test('register cached factory with different params', () {
248+
final getIt = GetIt.instance;
249+
constructorCounter = 0;
250+
getIt.registerCachedFactoryParam<TestClassParam, String, void>(
251+
(s, _) => TestClassParam(param1: s),
252+
);
253+
final instance1 = getIt<TestClassParam>(param1: 'abc');
254+
final instance2 = getIt<TestClassParam>(param1: '123');
255+
expect(instance1 is TestClassParam, true);
256+
expect(instance1.param1, 'abc');
257+
expect(instance2.param1, '123');
258+
expect(instance2 is TestClassParam, true);
259+
expect(instance1, isNot(instance2));
260+
expect(constructorCounter, 2);
261+
});
262+
263+
test('register cached factory with two equal params', () {
264+
final getIt = GetIt.instance;
265+
constructorCounter = 0;
266+
getIt.registerCachedFactoryParam<TestClassParam, String, int>(
267+
(f, s) => TestClassParam(param1: f, param2: s),
268+
);
269+
final instance1 = getIt<TestClassParam>(param1: 'abc', param2: 1);
270+
final instance2 = getIt<TestClassParam>(param1: 'abc', param2: 1);
271+
expect(instance1 is TestClassParam, true);
272+
expect(instance1.param1, 'abc');
273+
expect(instance1, instance2);
274+
expect(constructorCounter, 1);
275+
});
276+
277+
test('register cached factory with one different param out of two', () {
278+
final getIt = GetIt.instance;
279+
constructorCounter = 0;
280+
getIt.registerCachedFactoryParam<TestClassParam, String, int>(
281+
(f, s) => TestClassParam(param1: f, param2: s),
282+
);
283+
final instance1 = getIt<TestClassParam>(param1: 'abc', param2: 1);
284+
final instance2 = getIt<TestClassParam>(param1: 'abc', param2: 2);
285+
expect(instance1 is TestClassParam, true);
286+
expect(instance1.param1, 'abc');
287+
expect(instance1.param2, 1);
288+
expect(instance2.param1, 'abc');
289+
expect(instance2.param2, 2);
290+
expect(instance2 is TestClassParam, true);
291+
expect(instance1, isNot(instance2));
292+
expect(constructorCounter, 2);
293+
});
294+
219295
test('register constant', () {
220296
final getIt = GetIt.instance;
221297
constructorCounter = 0;

0 commit comments

Comments
 (0)