Hi everyone! I want to update a composable dependi...
# compose
a
Hi everyone! I want to update a composable depending on if a user is touching the screen or not. What I want is to update the UI if the user stops interacting with the app for 5 seconds.
So far I have something like this:
Copy code
val showSky = remember { mutableStateOf(false) }
    val skyAlpha by animateFloatAsState(if (showSky.value) 1f else .3f)
    val userInteracting = MutableSharedFlow<Long>(replay = 0)
    val coroutineScope = rememberCoroutineScope()

    Box(
        modifier = modifier
            .fillMaxSize()
            .pointerInteropFilter {
                coroutineScope.launch {
                    userInteracting.emit(System.currentTimeMillis())
                }
                false
            }
    ) {
        coroutineScope.launch {
            userInteracting.collectLatest {
                Log.d("pointerInteropFilter", "$it received")
                showSky.value = false
                delay(5000)
                showSky.value = true
                Log.d("pointerInteropFilter", "$it processed")
            }
        }
    }
The problem I'm facing is that the second time I start interacting with the composable the collectLatest reach
showSky.value = true
in an old event. Any help is appreciated to fix this problem or maybe to go in a different direction. Thanks in advanced.
Here some logs of the first & second time I interact with the composable
Copy code
First attemp 
2021-06-27 13:27:25.901 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811245901 received
2021-06-27 13:27:26.477 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811246477 received
2021-06-27 13:27:27.011 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811247010 received
2021-06-27 13:27:27.539 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811247538 received
2021-06-27 13:27:28.072 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811248071 received
2021-06-27 13:27:28.596 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811248595 received
2021-06-27 13:27:29.090 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811249089 received
2021-06-27 13:27:29.603 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811249603 received
2021-06-27 13:27:30.133 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811250133 received
2021-06-27 13:27:30.645 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811250644 received
2021-06-27 13:27:31.149 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811251148 received
2021-06-27 13:27:31.674 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811251673 received
2021-06-27 13:27:32.197 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811252196 received
2021-06-27 13:27:32.736 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811252736 received
2021-06-27 13:27:33.272 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811253271 received
2021-06-27 13:27:33.803 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811253803 received
2021-06-27 13:27:34.350 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811254349 received
2021-06-27 13:27:34.946 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811254946 received
2021-06-27 13:27:39.947 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811254946 processed
Second attemp
2021-06-27 13:29:06.886 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811346886 received
2021-06-27 13:29:07.368 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811347367 received
2021-06-27 13:29:07.785 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811347784 received
2021-06-27 13:29:08.181 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811348181 received
2021-06-27 13:29:08.647 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811348646 received
2021-06-27 13:29:09.095 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811349095 received
2021-06-27 13:29:09.537 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811349536 received
2021-06-27 13:29:09.913 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811349912 received
2021-06-27 13:29:10.308 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811350307 received
2021-06-27 13:29:10.691 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811350690 received
2021-06-27 13:29:11.887 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811346886 processed
2021-06-27 13:29:15.692 1308-1308/com.example.androiddevchallenge.mock D/pointerInteropFilter: 1624811350690 processed
l
Try calling
.conflate()
on your
collect
. It stops processing old values when new ones are received
So it would be something like:
Copy code
.collectLatest{
xxxxx
}.conflate()
a
Thanks Lukasz, I try this without luck. Actually my version was
Copy code
.conflate()
.collectLatest{
xxxxxx
}
but somehow the second time I start interacting with the app the first event scape the collectLatest and completes
Just in case someone faces the same issue in the future, my problem was not remembering the MutableSharedFlow and that cause the strange behavior. Lesson learned, remember to "remember"