Closed ykaito21 closed 2 years ago
When a non async Singleton depends on one with an async initialization registerSingletonWithDependencies
is your way to go.
@ykaito21 , you can create an AbstractCache and SharedPreferenceImpl
import 'package:shared_preferences/shared_preferences.dart';
abstract class AbstractCache {
getStringList(String key);
Future<bool> setStringList(String key, List<String> value);
}
class SharedPreferenceCache extends AbstractCache {
SharedPreferences cache;
SharedPreferenceCache({
required this.cache
});
@override
getStringList(String key) async {
var inst = await SharedPreferences.getInstance();
return inst.getStringList(key);
}
@override
Future<bool> setStringList(String key, List<String> value) async {
var inst = await SharedPreferences.getInstance();
return inst.setStringList(key, value);
}
}
After that use AbstractClass in NumberTriviaLocalDataSourceImpl.
So and fix your di/service_locator.dart like:
final sharedPreferences = await SharedPreferences.getInstance();
s1.registerLazySingleton<AbstractCache>(() => SharedPreferenceCache(cache: sharedPreferences));
Step 1: Register your dependency(shared preferences)
class DependencyInjection {
static void setup(){
GetIt.instance.registerLazySingletonAsync<SharedPreferences>(
() => SharedPreferences.getInstance(),
);
await GetIt.instance.isReady<SharedPreferences>(); // Add this line
GetIt.instance.registerLazySingleton<SharedDataService>(
() => SharedDataServiceImp(
GetIt.instance<SecureStorageService>(),
GetIt.instance<SharedPreferences>(),
),
);
}
Step 2: Attach the function to main func DependencyInjection.setup();
Step 3: Usage
final sf = getIt
I'm doing ResoCoder's TDD Clean Architecture Course, and it use get_it as DI. It was created in 2019, I tried to create the updated version, but I couldn't find the clear way to handle the case. Am I doing something wrong? Should I use
registerSingletonWithDependencies
or Is there any better way?This is the original code:
get_it: ^3.1.0
This is my updated version:
get_it: ^7.2.0