ReaderScreen: Great performance improvement by reducing recompositions count. (v1.0.1)

This commit is contained in:
acclorite 2024-06-12 17:04:30 +03:00
parent 8ecdbfbc84
commit 0a06ccdc67
5 changed files with 5 additions and 29 deletions

View file

@ -92,16 +92,6 @@ fun ReaderScreenRoot() {
state.value.listState.canScrollBackward && state.value.listState.canScrollForward state.value.listState.canScrollBackward && state.value.listState.canScrollForward
} }
} }
val firstVisibleItemIndex = remember {
derivedStateOf {
state.value.listState.firstVisibleItemIndex
}
}
val firstVisibleItemOffset = remember {
derivedStateOf {
state.value.listState.firstVisibleItemScrollOffset
}
}
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
viewModel.init( viewModel.init(
@ -119,21 +109,16 @@ fun ReaderScreenRoot() {
).show() ).show()
} }
) )
viewModel.onUpdateProgress(
onLibraryEvent = libraryViewModel::onEvent,
onHistoryEvent = historyViewModel::onEvent
)
} }
LaunchedEffect(canScroll) { LaunchedEffect(canScroll) {
if (!canScroll && !state.value.showMenu && !state.value.loading) { if (!canScroll && !state.value.showMenu && !state.value.loading) {
viewModel.onEvent(ReaderEvent.OnShowHideMenu(context = context)) viewModel.onEvent(ReaderEvent.OnShowHideMenu(context = context))
} }
} }
LaunchedEffect(firstVisibleItemIndex.value, firstVisibleItemOffset.value) {
viewModel.onUpdateProgress(
firstVisibleItemIndex = firstVisibleItemIndex.value,
firstVisibleItemOffset = firstVisibleItemOffset.value,
navigator = navigator,
onLibraryEvent = libraryViewModel::onEvent,
onHistoryEvent = historyViewModel::onEvent
)
}
DisposableEffect(Unit) { DisposableEffect(Unit) {
onDispose { onDispose {

View file

@ -21,7 +21,6 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import ua.acclorite.book_story.presentation.data.LocalNavigator
import ua.acclorite.book_story.presentation.data.removeDigits import ua.acclorite.book_story.presentation.data.removeDigits
import ua.acclorite.book_story.presentation.data.removeTrailingZero import ua.acclorite.book_story.presentation.data.removeTrailingZero
import ua.acclorite.book_story.presentation.screens.history.data.HistoryEvent import ua.acclorite.book_story.presentation.screens.history.data.HistoryEvent
@ -45,7 +44,6 @@ fun ReaderBottomBar(
onLibraryUpdateEvent: (LibraryEvent.OnUpdateBook) -> Unit, onLibraryUpdateEvent: (LibraryEvent.OnUpdateBook) -> Unit,
onHistoryUpdateEvent: (HistoryEvent.OnUpdateBook) -> Unit onHistoryUpdateEvent: (HistoryEvent.OnUpdateBook) -> Unit
) { ) {
val navigator = LocalNavigator.current
val progress by remember(state.value.book.progress) { val progress by remember(state.value.book.progress) {
derivedStateOf { derivedStateOf {
(state.value.book.progress * 100) (state.value.book.progress * 100)
@ -86,7 +84,6 @@ fun ReaderBottomBar(
onEvent( onEvent(
ReaderEvent.OnChangeProgress( ReaderEvent.OnChangeProgress(
progress = it, progress = it,
navigator = navigator,
firstVisibleItemIndex = state.value.listState.firstVisibleItemIndex, firstVisibleItemIndex = state.value.listState.firstVisibleItemIndex,
firstVisibleItemOffset = 0, firstVisibleItemOffset = 0,
refreshList = { book -> refreshList = { book ->

View file

@ -217,5 +217,4 @@ fun LazyItemScope.ReaderTextParagraph(
) )
) )
} }
} }

View file

@ -70,7 +70,6 @@ sealed class ReaderEvent {
data class OnChangeProgress( data class OnChangeProgress(
val progress: Float, val progress: Float,
val navigator: Navigator,
val firstVisibleItemIndex: Int, val firstVisibleItemIndex: Int,
val firstVisibleItemOffset: Int, val firstVisibleItemOffset: Int,
val refreshList: (Book) -> Unit val refreshList: (Book) -> Unit

View file

@ -1270,14 +1270,11 @@ class ReaderViewModel @Inject constructor(
@OptIn(FlowPreview::class) @OptIn(FlowPreview::class)
suspend fun onUpdateProgress( suspend fun onUpdateProgress(
firstVisibleItemIndex: Int,
firstVisibleItemOffset: Int,
navigator: Navigator,
onLibraryEvent: (LibraryEvent) -> Unit, onLibraryEvent: (LibraryEvent) -> Unit,
onHistoryEvent: (HistoryEvent) -> Unit onHistoryEvent: (HistoryEvent) -> Unit
) { ) {
snapshotFlow { snapshotFlow {
firstVisibleItemIndex to firstVisibleItemOffset _state.value.listState.firstVisibleItemIndex to _state.value.listState.firstVisibleItemScrollOffset
} }
.debounce(300) .debounce(300)
.collectLatest { items -> .collectLatest { items ->
@ -1307,7 +1304,6 @@ class ReaderViewModel @Inject constructor(
onEvent( onEvent(
ReaderEvent.OnChangeProgress( ReaderEvent.OnChangeProgress(
progress = progress, progress = progress,
navigator = navigator,
firstVisibleItemIndex = items.first, firstVisibleItemIndex = items.first,
firstVisibleItemOffset = items.second, firstVisibleItemOffset = items.second,
refreshList = { book -> refreshList = { book ->