Ola!
O erro Unresolved reference 'collect'
ocorre quando o projeto não tem as dependências corretas para coroutines e Flow, ou quando você está tentando usar collect
fora de um contexto de Flow
.
1. Verifique se seu buscaTodos()
realmente retorna um Flow<List<Produto>>
O método buscaTodos()
no ProdutoDao
precisa ser assim:
@Query("SELECT * FROM Produto")
fun buscaTodos(): Flow<List<Produto>>
Se ele retornar LiveData<List<Produto>>
ou List<Produto>
, o .collect {}
não estará disponível.
2. Adicione (ou verifique) as dependências de coroutines e Flow no build.gradle
(Module: app)
Certifique-se de ter essas dependências no seu build.gradle
:
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3"
Também pode ser necessário adicionar essa (se estiver usando Flow com Room):
implementation "androidx.room:room-ktx:2.6.1"
3. Verifique se você está usando um lifecycleScope
(se estiver em um Fragment ou Activity)
Se estiver dentro de uma Activity ou Fragment, prefira usar:
lifecycleScope.launch {
produtoDao.buscaTodos().collect { produtos ->
adapter.atualiza(produtos)
}
}
⚠ launch { ... }
isolado pode não estar no escopo correto — evite isso fora de lifecycleScope
, viewModelScope
etc.
4. Caso esteja usando ViewModel
Se estiver dentro de uma ViewModel
, use viewModelScope.launch { ... }
.
Exemplo completo (em um Fragment):
class ProdutoFragment : Fragment() {
private val produtoDao: ProdutoDao by lazy {
// inicialização do dao
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
lifecycleScope.launch {
produtoDao.buscaTodos().collect { produtos ->
adapter.atualiza(produtos)
}
}
}
}
Resumo do que revisar
- O método
buscaTodos()
retorna um Flow
- As dependências de
coroutines
e room-ktx
estão adicionadas - Está usando
lifecycleScope.launch
ou viewModelScope.launch
- Importou
import kotlinx.coroutines.flow.collect
Se você ainda tiver problemas, envie:
- A assinatura de
buscaTodos()
no seu DAO - O bloco de código onde está usando o
launch
- Suas dependências no
build.gradle
Abs;