fix: 查看大图时闪烁第一张图

This commit is contained in:
HuanCheng65 2024-01-26 21:05:23 +08:00
parent 65af5656fb
commit 6ad018c6f1
No known key found for this signature in database
GPG Key ID: 5EC9DD60A32C7360
4 changed files with 44 additions and 63 deletions

View File

@ -25,6 +25,7 @@ data class PicItem(
val originUrl: String,
val showOriginBtn: Boolean,
val originSize: Int,
val postId: Long? = null,
) : Parcelable
@Immutable

View File

@ -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,31 +123,17 @@ class PhotoViewActivity : BaseComposeActivityWithParcelable<PhotoViewData>() {
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 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 (loaded) {
val pageCount by remember { derivedStateOf { items.size } }
val pagerState = rememberPagerState(initialPage = initialIndex) { pageCount }
@ -155,8 +142,6 @@ class PhotoViewActivity : BaseComposeActivityWithParcelable<PhotoViewData>() {
if (pagerState.currentPage != initialIndex) pagerState.scrollToPage(initialIndex)
}
Surface(color = Color.Black) {
if (items.isNotEmpty()) {
LaunchedEffect(pagerState.currentPage, pageCount, loadPicPageData) {
loadPicPageData?.let {
val item = items[pagerState.currentPage]
@ -182,7 +167,7 @@ class PhotoViewActivity : BaseComposeActivityWithParcelable<PhotoViewData>() {
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(

View File

@ -41,6 +41,17 @@ class PhotoViewViewModel :
.flatMapConcat { it.producePartialChange() },
)
private fun List<PicPageBean.PicBean>.toPhotoViewItems(): List<PhotoViewItem> =
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<PhotoViewPartialChange.LoadPrev> =
TiebaApi.getInstance()
.picPageFlow(
@ -54,14 +65,7 @@ class PhotoViewViewModel :
prev = true
)
.map<PicPageBean, PhotoViewPartialChange.LoadPrev> { 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, PhotoViewPartialChange.LoadMore> { 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, PhotoViewPartialChange.Init> { 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,
)

View File

@ -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