Estou usando uma consulta observável para observar alterações em um banco de dados Android Room e exibir os resultados em uma LazyColumn. Isso funciona bem, mas agora quero que o usuário consiga alterar a ordem de classificação. Com minha implementação atual, alterar a ordem de classificação não faz com que a LazyColumn se recomponha. Se outra parte do estado mudar, a LazyColumn se recomporá e a ordenação atualizada será refletida na visualização.
Meu DAO se parece com isso:
@Dao
interface EntityDao {
@Query("SELECT * FROM entity" +
" ORDER BY " +
" CASE :sort WHEN 'Newest' THEN created END DESC," +
" CASE :sort WHEN 'Oldest' THEN created END ASC")
fun all(sort: String): Flow<List<Entity>>
}
Meu modelo de visualização se parece com isto:
class EntityViewModel(application: Application) : AndroidViewModel(application) {
private val entityDao = AppDatabase.getDatabase(context = application.baseContext).entityDao()
var entities: Flow<List<Entity>> = entityDao.all()
private val _selectedSortMode = MutableStateFlow(EntitySortMode.NEWEST)
val selectedSortMode = _selectedSortMode.asStateFlow()
private fun updateDatabaseQuery() {
val sort = _selectedSortMode.value.string
entities = entityDao.all(sort)
}
fun changeSorting(newSortMode: EntitySortMode) {
_selectedSortMode.value = newSortMode
updateDatabaseQuery()
}
}
E meu composable é o seguinte:
@Composable
fun EntityView(viewModel: EntityViewModel) {
val entities by viewModel.entities.collectAsStateWithLifecycle(initialValue = emptyList())
LazyColumn {
items(
entities,
key = {
it.primaryKey
}
) { entity ->
Box(
modifier = Modifier
.animateItem()
.clickable {}
) {
RowItem(entity)
}
}
}
}
Simplifiquei o código para as partes relevantes. Recuperar e exibir dados do banco de dados funciona corretamente, o problema é que alterar a ordem de classificação (chamando changeSorting
) não resulta na recomposição do LazyColumn. Os itens na lista são os mesmos, mas a ordem é diferente, e isso parece impedir que a recomposição ocorra.