Skip to content

Commit

Permalink
feat: ignoreReassignmentError configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
venkata-reddy-dev committed Mar 21, 2024
1 parent 6f539f4 commit c8b4496
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 2 deletions.
4 changes: 4 additions & 0 deletions lib/get_it.dart
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,10 @@ abstract class GetIt {
/// If you really need to you can disable the asserts by setting[allowReassignment]= true
bool allowReassignment = false;

/// By default it's throws error when [allowReassignment]= false. and trying to register same type
/// If you really need, you can disable the Asserts / Errror by setting[ignoreReassignmentError]= true
bool ignoreReassignmentError = false;

/// Till V7.6.7 GetIt didn't allow to register multiple instances of the same type.
/// if you want to register multiple instances of the same type you can enable this
/// and use `getAll()` to retrieve all instances of that parent type
Expand Down
21 changes: 19 additions & 2 deletions lib/get_it_impl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,11 @@ class _GetItImplementation implements GetIt {
@override
bool allowReassignment = false;

/// By default it's throws error when [allowReassignment]= false. and trying to register same type
/// If you really need, you can disable the Asserts / Errror by setting[ignoreReassignmentError]= true
@override
bool ignoreReassignmentError = false;

/// Is used by several other functions to retrieve the correct [_ServiceFactory]
_ServiceFactory<T, dynamic, dynamic>?
_findFirstFactoryByNameAndTypeOrNull<T extends Object>(
Expand Down Expand Up @@ -1027,19 +1032,31 @@ class _GetItImplementation implements GetIt {
if (instanceName != null) {
throwIf(
existingTypeRegistration.namedFactories.containsKey(instanceName) &&
!allowReassignment,
!allowReassignment &&
!ignoreReassignmentError,
ArgumentError(
'Object/factory with name $instanceName and '
'type $T is already registered inside GetIt. ',
),
);

/// skip registration
if (ignoreReassignmentError && !allowReassignment) {
return;
}
} else {
if (existingTypeRegistration.factories.isNotEmpty) {
throwIfNot(
allowReassignment ||
GetIt.allowRegisterMultipleImplementationsOfoneType,
GetIt.allowRegisterMultipleImplementationsOfoneType ||
ignoreReassignmentError,
ArgumentError('Type $T is already registered inside GetIt. '),
);

/// skip registration
if (ignoreReassignmentError && !allowReassignment) {
return;
}
}
}
}
Expand Down
57 changes: 57 additions & 0 deletions test/ignore_error_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import 'package:get_it/get_it.dart';
import 'package:test/test.dart';

void main() {
test(' Throws ArgumentError ', () async {
final getIt = GetIt.instance;
getIt.allowReassignment = false;
getIt.ignoreReassignmentError = false;
getIt.reset();
getIt.registerSingleton<DataStore>(MockDataStore());

expect(
() => getIt.registerSingleton<DataStore>(RemoteDataStore()),
throwsArgumentError,
);
});

test(' replaces dependency safely ', () async {
final getIt = GetIt.instance;
getIt.reset();
getIt.allowReassignment = true;
getIt.ignoreReassignmentError = false;
getIt.registerSingleton<DataStore>(MockDataStore());
getIt.registerSingleton<DataStore>(RemoteDataStore());

expect(getIt<DataStore>(), isA<RemoteDataStore>());
});

test(' Ignores ReassignmentError ', () async {
final getIt = GetIt.instance;
getIt.reset();
getIt.allowReassignment = false;
getIt.ignoreReassignmentError = true;
getIt.registerSingleton<DataStore>(MockDataStore());
final remoteDataStore = RemoteDataStore();
getIt.registerSingleton<DataStore>(remoteDataStore);

expect(getIt<DataStore>(), isA<MockDataStore>());
});

test(' does not care about [ignoreReassignmentError] varibale ', () async {
final getIt = GetIt.instance;
getIt.reset();
getIt.allowReassignment = true;
getIt.ignoreReassignmentError = true;
getIt.registerSingleton<DataStore>(MockDataStore());
getIt.registerSingleton<DataStore>(RemoteDataStore());

expect(getIt<DataStore>(), isA<RemoteDataStore>());
});
}

abstract class DataStore {}

class RemoteDataStore implements DataStore {}

class MockDataStore implements DataStore {}

0 comments on commit c8b4496

Please sign in to comment.