From 4e3369362727f86aee9748ecf036e15bb03a2134 Mon Sep 17 00:00:00 2001 From: HapeLee <63206378+HapeLee@users.noreply.github.com> Date: Fri, 12 Jun 2026 15:33:25 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=B5=AE=E5=8A=A8=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E5=9C=A8=E8=BE=B9=E7=95=8C=E7=8A=B6=E6=80=81=E4=B8=8B=E8=B6=8A?= =?UTF-8?q?=E7=95=8C=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/read/ReadBookSearchBar.kt | 10 ++++--- .../app/ui/book/read/ReadBookViewModel.kt | 26 ++++++++++++++++--- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookSearchBar.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookSearchBar.kt index 3d5e53f20..6ccdb4af7 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookSearchBar.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookSearchBar.kt @@ -29,8 +29,8 @@ fun ReadBookSearchBar( val searchVisible = state.isShowingSearchResult && !(state.menuVisible && state.menuState.currentRoute != ReadBookMenuRoute.Main) val hasResults = state.searchResultList.isNotEmpty() - val currentIndex = state.searchResultIndex val totalResults = state.searchResultList.size + val currentIndex = state.searchResultIndex.coerceIn(0, (totalResults - 1).coerceAtLeast(0)) Box(Modifier.fillMaxSize()) { // Left FAB - previous result @@ -45,9 +45,11 @@ fun ReadBookSearchBar( AppFloatingActionButton( onClick = { val prevIndex = currentIndex - 1 + val result = state.searchResultList.getOrNull(prevIndex) + ?: return@AppFloatingActionButton onIntent( ReadBookIntent.NavigateToSearchResult( - state.searchResultList[prevIndex], prevIndex + result, prevIndex ) ) }, @@ -75,9 +77,11 @@ fun ReadBookSearchBar( AppFloatingActionButton( onClick = { val nextIndex = currentIndex + 1 + val result = state.searchResultList.getOrNull(nextIndex) + ?: return@AppFloatingActionButton onIntent( ReadBookIntent.NavigateToSearchResult( - state.searchResultList[nextIndex], nextIndex + result, nextIndex ) ) }, diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index 2503b6507..c6e943b61 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -231,9 +231,11 @@ class ReadBookViewModel( is ReadBookIntent.HideSearchMenu -> _uiState.update { it.copy(searchMenuVisible = false) } is ReadBookIntent.SetSearchResults -> { _uiState.update { + val results = intent.results.toImmutableList() + val index = intent.index.coerceSearchResultIndex(results.size) it.copy( - searchResultList = intent.results.toImmutableList(), - searchResultIndex = intent.index, + searchResultList = results, + searchResultIndex = index, isShowingSearchResult = true, searchMenuVisible = true, menuState = ReadBookMenuState(), @@ -243,7 +245,13 @@ class ReadBookViewModel( } is ReadBookIntent.SetSearchResultIndex -> { - _uiState.update { it.copy(searchResultIndex = intent.index) } + _uiState.update { + it.copy( + searchResultIndex = intent.index.coerceSearchResultIndex( + it.searchResultList.size + ) + ) + } } is ReadBookIntent.SetShowingSearchResult -> { @@ -252,7 +260,13 @@ class ReadBookViewModel( is ReadBookIntent.NavigateToSearchResult -> { ReadBook.saveCurrentBookProgress() - _uiState.update { it.copy(searchResultIndex = intent.index) } + _uiState.update { + it.copy( + searchResultIndex = intent.index.coerceSearchResultIndex( + it.searchResultList.size + ) + ) + } navigateToSearchResult(intent.result) } @@ -3466,3 +3480,7 @@ private const val TITLE_BAR_ICON_KEY = "icons" private const val TOOL_BUTTON_PREFS = "tool_button_config" private const val TOOL_BUTTON_KEY = "tool_buttons" private const val DEFAULT_ENABLED_BUTTON_COUNT = 5 + +private fun Int.coerceSearchResultIndex(resultSize: Int): Int { + return if (resultSize <= 0) 0 else coerceIn(0, resultSize - 1) +}