From 6ad018c6f1afcbd2fcf2fdec7b32b61ff6827e9f Mon Sep 17 00:00:00 2001 From: HuanCheng65 <22636177+HuanCheng65@users.noreply.github.com> Date: Fri, 26 Jan 2024 21:05:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=9F=A5=E7=9C=8B=E5=A4=A7=E5=9B=BE?= =?UTF-8?q?=E6=97=B6=E9=97=AA=E7=83=81=E7=AC=AC=E4=B8=80=E5=BC=A0=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tieba/post/models/PhotoViewData.kt | 1 + .../ui/page/photoview/PhotoViewActivity.kt | 53 +++++++------------ .../ui/page/photoview/PhotoViewViewModel.kt | 47 +++++++--------- .../tieba/post/ui/utils/PhotoViewUtils.kt | 6 ++- 4 files changed, 44 insertions(+), 63 deletions(-) diff --git a/app/src/main/java/com/huanchengfly/tieba/post/models/PhotoViewData.kt b/app/src/main/java/com/huanchengfly/tieba/post/models/PhotoViewData.kt index 170eb14f..65136ed7 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/models/PhotoViewData.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/models/PhotoViewData.kt @@ -25,6 +25,7 @@ data class PicItem( val originUrl: String, val showOriginBtn: Boolean, val originSize: Int, + val postId: Long? = null, ) : Parcelable @Immutable diff --git a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/photoview/PhotoViewActivity.kt b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/photoview/PhotoViewActivity.kt index d5481f5f..12d8596e 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/photoview/PhotoViewActivity.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/photoview/PhotoViewActivity.kt @@ -27,6 +27,7 @@ import androidx.compose.material.icons.rounded.Download import androidx.compose.material.icons.rounded.Share import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableFloatStateOf @@ -122,41 +123,25 @@ class PhotoViewActivity : BaseComposeActivityWithParcelable() { viewModel.send(PhotoViewUiIntent.Init(data)) viewModel.initialized = true } - val items by viewModel.uiState.collectPartialAsState( - prop1 = PhotoViewUiState::data, - initial = persistentListOf() - ) - val initialIndex by viewModel.uiState.collectPartialAsState( - prop1 = PhotoViewUiState::initialIndex, - initial = 0 - ) - val totalAmount by viewModel.uiState.collectPartialAsState( - prop1 = PhotoViewUiState::totalAmount, - initial = 0 - ) - val hasPrev by viewModel.uiState.collectPartialAsState( - prop1 = PhotoViewUiState::hasPrev, - initial = false - ) - val hasNext by viewModel.uiState.collectPartialAsState( - prop1 = PhotoViewUiState::hasNext, - initial = false - ) - val loadPicPageData by viewModel.uiState.collectPartialAsState( - prop1 = PhotoViewUiState::loadPicPageData, - initial = null - ) - - val pageCount by remember { derivedStateOf { items.size } } - - val pagerState = rememberPagerState(initialPage = initialIndex) { pageCount } - - LaunchedEffect(initialIndex) { - if (pagerState.currentPage != initialIndex) pagerState.scrollToPage(initialIndex) - } + val uiState by viewModel.uiState.collectAsState() + val items by remember { derivedStateOf { uiState.data } } + val initialIndex by remember { derivedStateOf { uiState.initialIndex } } + val totalAmount by remember { derivedStateOf { uiState.totalAmount } } + val hasPrev by remember { derivedStateOf { uiState.hasPrev } } + val hasNext by remember { derivedStateOf { uiState.hasNext } } + val loadPicPageData by remember { derivedStateOf { uiState.loadPicPageData } } + val loaded by remember { derivedStateOf { uiState.data.isNotEmpty() } } Surface(color = Color.Black) { - if (items.isNotEmpty()) { + if (loaded) { + val pageCount by remember { derivedStateOf { items.size } } + + val pagerState = rememberPagerState(initialPage = initialIndex) { pageCount } + + LaunchedEffect(initialIndex) { + if (pagerState.currentPage != initialIndex) pagerState.scrollToPage(initialIndex) + } + LaunchedEffect(pagerState.currentPage, pageCount, loadPicPageData) { loadPicPageData?.let { val item = items[pagerState.currentPage] @@ -182,7 +167,7 @@ class PhotoViewActivity : BaseComposeActivityWithParcelable() { Box(modifier = Modifier.fillMaxSize()) { HorizontalPager( state = pagerState, - key = { "${items[it].picId}_${items[it].overallIndex}" } + key = { "${items[it].picId}_${items[it].postId}" } ) { val item = items[it] ViewPhoto( diff --git a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/photoview/PhotoViewViewModel.kt b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/photoview/PhotoViewViewModel.kt index d112108b..cc246a9a 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/photoview/PhotoViewViewModel.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/photoview/PhotoViewViewModel.kt @@ -41,6 +41,17 @@ class PhotoViewViewModel : .flatMapConcat { it.producePartialChange() }, ) + private fun List.toPhotoViewItems(): List = + map { + PhotoViewItem( + picId = it.img.original.id, + originUrl = it.img.original.originalSrc, + url = if (it.showOriginalBtn) it.img.original.bigCdnSrc else null, + overallIndex = it.overAllIndex.toInt(), + postId = it.postId?.toLongOrNull() + ) + } + private fun PhotoViewUiIntent.LoadPrev.producePartialChange(): Flow = TiebaApi.getInstance() .picPageFlow( @@ -54,14 +65,7 @@ class PhotoViewViewModel : prev = true ) .map { picPageBean -> - val items = picPageBean.picList.map { - PhotoViewItem( - picId = it.img.original.id, - originUrl = it.img.original.originalSrc, - url = if (it.showOriginalBtn) it.img.original.bigCdnSrc else null, - overallIndex = it.overAllIndex.toInt() - ) - } + val items = picPageBean.picList.toPhotoViewItems() val hasPrev = items.first().overallIndex > 1 PhotoViewPartialChange.LoadPrev.Success( hasPrev = hasPrev, @@ -87,14 +91,7 @@ class PhotoViewViewModel : prev = false ) .map { picPageBean -> - val items = picPageBean.picList.map { - PhotoViewItem( - picId = it.img.original.id, - originUrl = it.img.original.originalSrc, - url = if (it.showOriginalBtn) it.img.original.bigCdnSrc else null, - overallIndex = it.overAllIndex.toInt() - ) - } + val items = picPageBean.picList.toPhotoViewItems() val hasNext = items.last().overallIndex < picPageBean.picAmount.toInt() PhotoViewPartialChange.LoadMore.Success( hasNext = hasNext, @@ -115,7 +112,8 @@ class PhotoViewViewModel : picId = item.picId, originUrl = item.originUrl, url = if (item.showOriginBtn) item.url else null, - overallIndex = index + 1 + overallIndex = index + 1, + postId = item.postId ) }, hasNext = false, @@ -139,14 +137,7 @@ class PhotoViewViewModel : ) .map { picPageBean -> val picAmount = picPageBean.picAmount.toInt() - val fetchedItems = picPageBean.picList.map { - PhotoViewItem( - picId = it.img.original.id, - originUrl = it.img.original.originalSrc, - url = if (it.showOriginalBtn) it.img.original.bigCdnSrc else null, - overallIndex = it.overAllIndex.toInt() - ) - } + val fetchedItems = picPageBean.picList.toPhotoViewItems() val firstItemIndex = fetchedItems.first().overallIndex val localItems = if (data.data.picIndex == 1) emptyList() else data.picItems.subList( @@ -157,7 +148,8 @@ class PhotoViewViewModel : picId = item.picId, originUrl = item.originUrl, url = if (item.showOriginBtn) item.url else null, - overallIndex = firstItemIndex - (data.data.picIndex - 1 - index) + overallIndex = firstItemIndex - (data.data.picIndex - 1 - index), + postId = item.postId ) } val items = localItems + fetchedItems @@ -324,5 +316,6 @@ data class PhotoViewItem( val picId: String, val originUrl: String, val url: String?, - val overallIndex: Int + val overallIndex: Int, + val postId: Long? = null, ) \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/ui/utils/PhotoViewUtils.kt b/app/src/main/java/com/huanchengfly/tieba/post/ui/utils/PhotoViewUtils.kt index b2cc27d4..0ff696b2 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/ui/utils/PhotoViewUtils.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/ui/utils/PhotoViewUtils.kt @@ -39,7 +39,8 @@ fun getPhotoViewData( url = picUrl, originUrl = originUrl, showOriginBtn = showOriginBtn, - originSize = originSize + originSize = originSize, + postId = post.id ) ) ) @@ -85,7 +86,8 @@ fun getPhotoViewData( url = mediaItem.bigPic, originUrl = mediaItem.originPic, showOriginBtn = mediaItem.showOriginalBtn == 1, - originSize = mediaItem.originSize + originSize = mediaItem.originSize, + postId = mediaItem.postId ) }.toImmutableList(), index = index