Bom dia.
Estou com uma dúvida sobre um comportamento que aconteceu durante a realização da aula. Talvez o instrutor Alex não tenha tido o mesmo problema, mas tenho um bug em algumas situações com o seguinte código da aula. Na classe LoginActivity, no método:
private fun autentica(usuario: String, senha: String) {
lifecycleScope.launch {
usuarioDao.autentica(
usuarioNome = usuario,
usuarioSenha = senha
)?.let { usuario ->
Log.i("Usuario Base", "Indo para Lista de Produtos")
vaiPara(ListaProdutosActivity::class.java)
dataStore.edit { preferences ->
preferences[CHAVE_USUARIO_ID_LOGADO] = usuario.id
}
finish()
}
?: toast("Usuário não encontrado")
}
}
quando chamamos o método vaiPara() e logo em seguida usamos o dataStore, a próxima activity é executada, porém na próxima activity, a primeira coisa que é feita no onCreate() é verificar quando usuário está logado no sistema.
Código da activity ListaProdutosActivity que herda de UsuarioBaseActivity.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
configuraRecyclerView()
configuraFab()
lifecycleScope.launch {
launch {
usuario.filterNotNull().collect {
buscaProdutosDoUsuario()
}
}
}
}
As vezes quando essa activity é aberta ainda não deu tempo do dataStore da tela de login ter finalizado (por ser assíncrono) e na tela de Lista de Produtos devido o dataStore ainda não ter o registro do usuário logado o programa volta para a tela de Login novamente. Teria como resolver esse bug utilizando o dataStore ou teria que usar o sharedPreference por ser síncrono e desse jeito iria garantir que quando chegasse na tela de Lista de Produtos já ia ter algo salvo no preferences. Não sei se estou certo, mas o problema de coisas assíncronas é não sabermos quando vai acabar, e não sei se tem como deixar reativo a leitura do dataStore na tela de Lista de produtos.