i have a issue with a lazy column and a database. When i load my activity with a lazy column, the database is call to get list of tournaments. But the list is not display in the lazy column. The list is display the moment after i click to change of page/activity although it makes sense.
DAO:
@Dao
interface TournamentDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun insert(tournament: TournamentEntity)
@Update
suspend fun update(tournament: TournamentEntity)
@Delete
suspend fun delete(tournament: TournamentEntity)
@Query("SELECT * from tournaments WHERE id = :id")
fun getItem(id: Int): Flow<TournamentEntity>
@Query("SELECT * from tournaments ORDER BY id ASC")
fun getAllItems(): Flow<List<TournamentEntity>>
}
REPOSITORY:
class OfflineTournamentRepository(private val tournamentDao: TournamentDao):TournamentRepository {
override fun getAllStream(): Flow<List<TournamentEntity>> = tournamentDao.getAllItems()
override fun getStream(id: Int): Flow<TournamentEntity?> = tournamentDao.getItem(id)
override suspend fun insert(tournament: TournamentEntity) = tournamentDao.insert(tournament)
override suspend fun delete(tournament: TournamentEntity) = tournamentDao.delete(tournament)
override suspend fun update(tournament: TournamentEntity) = tournamentDao.update(tournament)
}
VIEW MODEL:
class TournamentListViewModel(private val tournamentRepository: TournamentRepository):ViewModel() {
private val _uiState = MutableStateFlow(TournamentListState())
var uiState: StateFlow<TournamentListState> = _uiState.asStateFlow()
private set
fun updateUiState(tournaments: List<Tournament>) {
_uiState.value.tournaments=tournaments
}
private suspend fun getAll(){
_uiState.value.tournaments=tournamentRepository.getAllStream().first().map { it.toModel() }
}
init{
viewModelScope.launch {
getAll()
}
}
}
STATE:
class TournamentListState(
var tournaments: List<Tournament> = listOf(),
) {
}
LAZY COLUMN OF ACTIVITY:
LazyColumn(
modifier = Modifier
.fillMaxWidth()
.fillMaxHeight(0.91f)
.padding(0.dp, 10.dp, 0.dp, 0.dp),
verticalArrangement = Arrangement.spacedBy(10.dp)
) {
items(tournamentListViewModel.uiState.value.tournaments){ tournament: Tournament ->
TournamentItemCard(
tournament = tournament,
modifier = Modifier
.fillParentMaxWidth()
.fillParentMaxHeight(0.1f)
)
}
}
Please what i have to change for the list display when data arrives?
val uiState = tournamentListViewModel.uiState.collectAsState()and then passing tournament list in your LazyColumn's item likeitems(uiState.tournaments)?_uiState.value = _uiState.value.copy(tournaments = tournamentRepository.getAllStream().first().map { it.toModel() }and also change yourTournamentListStateinto data class