Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida sobre o dataStore

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.

2 respostas
solução!

Fala Wilkison, de boa ?

Cara é um caso clássico de race condition, o datastore até permite tu rodar de maneira sincrona, https://developer.android.com/topic/libraries/architecture/datastore#synchronous

Embora não seja projetado pra isso, mas deve resolver teu problema.

Obrigado, realmente, tem a ver com isso. Passei umas horas pesquisando, vi em alguns sites que tem outras maneiras de "registrar" um usuário logado no sistema, por exemplo, salvando no dataStore e passando como parâmetro na intent que chama a próxima activity e, nessa activity lendo o resultado que veio como parâmetro e se não tiver nada na intent, ler então do dataStore. Em resumo, a solução pode ser tanto uma refatoração/outra abordagem ou forçar o dataStore a rodar de forma síncrona (o que não é recomendado pois pode travar a UI).