MaxUt
02/16/2022, 12:05 PM@Composable
fun RoomsScreen(
onRoomClick: (Int) -> Unit,
onBack: () -> Unit
) {
val rooms = remember { mutableStateOf(emptyList<WSRoom>()) }
rooms.value = runBlocking { RoomRepository.getAllRooms() }
...
}
Here I've noticed that the RoomRepository.getAllRooms gets called every recomposition. What are your recommandation to avoid that ?hfhbd
02/16/2022, 12:58 PMMichael Paus
02/16/2022, 1:10 PMhfhbd
02/16/2022, 1:11 PMMaxUt
02/16/2022, 1:11 PMAlbert Chang
02/16/2022, 1:17 PMrunBlocking
at any situation.Michael Paus
02/16/2022, 1:18 PMhfhbd
02/16/2022, 1:18 PMMaxUt
02/16/2022, 1:53 PMclass RoomRepository {
companion object {
fun getAllRooms(): StateFlow<List<WSRoom>> {
val rooms = asyncOperation() // There is more to it but I simplified for this example
return MutableStateFlow(rooms)
}
}
}
@Composable
fun RoomsScreen(
onRoomClick: (Int) -> Unit,
onBack: () -> Unit
) {
val rooms = RoomRepository.getAllRooms().collectAsState()
...
}
I still seems to get the same side effect. Is there a way not to call getAllRooms multiple time or am I supposed to pass the rooms as a paramater ? I also checked if I could add this logic in a ViewModel but they don't seem to be available for desktopMichael Paus
02/16/2022, 2:47 PMMaxUt
02/16/2022, 2:49 PMclass RoomRepository {
companion object {
private var _rooms = MutableStateFlow(getAllRooms())
val rooms: StateFlow<List<WSRoom>> = _rooms
private fun getAllRooms(): List<WSRoom> {
val events = EventRepository.getCurrentEvents()
val rooms = mutableListOf<WSRoom>()
events.forEach { event ->
rooms.addAll(getEventRooms(event.id))
}
return rooms
}
}
}
@Composable
fun RoomsScreen(
onRoomClick: (Int) -> Unit,
onBack: () -> Unit
) {
val rooms by RoomRepository.rooms.collectAsState()
...
}
Michael Paus
02/16/2022, 2:53 PMMaxUt
02/16/2022, 2:54 PMhfhbd
02/16/2022, 2:56 PMgetAllRooms
is blocking.
class RoomRepository {
companion object {
val rooms: Flow<List<WSRoom>> get() = flow {
emit(EventRepository.getCurrentEvents())
}
}
}
@Composable
fun RoomsScreen(
onRoomClick: (Int) -> Unit,
onBack: () -> Unit
) {
val rooms by remember { RoomRepository.rooms.collectAsState(emptyList()) }
...
}