Contexto
Eu tenho o método principal:
void main() {
setupBeforeRun(); // <--- this is important
runApp(const App());
}
void setupBeforeRun() {
DependencyInjection.configure(); // <--- here I set up DB object
DependencyInjection.get<DictionaryService>().getDictionaries(); // <-- here I am using it
}
em DependencyInjection
acabei de criar Storage
uma instância:
class StorageService {
late Database _db;
StorageService() {
var future = initDb().then((value) => _db = value);
}
Future<Database> initDb() async {
if (Platform.isWindows || Platform.isLinux) {
sqfliteFfiInit();
databaseFactory = databaseFactoryFfi;
}
return openDatabase(
join(await getDatabasesPath(), 'my.db'),
onCreate: (db, version) => _createTables(db, version),
version: 1,
);
}
Desafio
Quero parar meu aplicativo até que _db
seja inicializado corretamente. Caso contrário, recebi um erro aleatoriamente Field '_db@24081564 has not been initialized
. Estou usando async
aqui porque openDatabase
é async
.
O que não funciona
bool isNotComplited = true
var future = initDb().then((value) => _db = value).whenComplited(isNotComplited = false);
while(isNotComplited){}
Ele apenas trava todos os aplicativos e o futuro nunca é concluído.
Pergunta
Como esperar o futuro até que esteja completo e depois continuar? Não me importo com a latência de espera, o banco de dados inicializado é mais importante para mim. O código acima é apenas um exemplo. Quero saber como parar e esperar que o futuro seja concluído na função síncrona ?
Eu sugiro que você registre seu registro
StorageService
com RegisterLazySingletonAsync . Para fazer isso você precisa criar um método assíncrono, que retorne seu arquivoStorageService
.Agora você registra seu serviço no GetIt.
Você pode então recuperar seu StorageService fazendo o seguinte: