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 originUrl: String,
val showOriginBtn: Boolean, val showOriginBtn: Boolean,
val originSize: Int, val originSize: Int,
val postId: Long? = null,
) : Parcelable ) : Parcelable
@Immutable @Immutable

View File

@ -27,6 +27,7 @@ import androidx.compose.material.icons.rounded.Download
import androidx.compose.material.icons.rounded.Share import androidx.compose.material.icons.rounded.Share
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableFloatStateOf
@ -122,41 +123,25 @@ class PhotoViewActivity : BaseComposeActivityWithParcelable<PhotoViewData>() {
viewModel.send(PhotoViewUiIntent.Init(data)) viewModel.send(PhotoViewUiIntent.Init(data))
viewModel.initialized = true viewModel.initialized = true
} }
val items by viewModel.uiState.collectPartialAsState( val uiState by viewModel.uiState.collectAsState()
prop1 = PhotoViewUiState::data, val items by remember { derivedStateOf { uiState.data } }
initial = persistentListOf() val initialIndex by remember { derivedStateOf { uiState.initialIndex } }
) val totalAmount by remember { derivedStateOf { uiState.totalAmount } }
val initialIndex by viewModel.uiState.collectPartialAsState( val hasPrev by remember { derivedStateOf { uiState.hasPrev } }
prop1 = PhotoViewUiState::initialIndex, val hasNext by remember { derivedStateOf { uiState.hasNext } }
initial = 0 val loadPicPageData by remember { derivedStateOf { uiState.loadPicPageData } }
) val loaded by remember { derivedStateOf { uiState.data.isNotEmpty() } }
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)
}
Surface(color = Color.Black) { 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) { LaunchedEffect(pagerState.currentPage, pageCount, loadPicPageData) {
loadPicPageData?.let { loadPicPageData?.let {
val item = items[pagerState.currentPage] val item = items[pagerState.currentPage]
@ -182,7 +167,7 @@ class PhotoViewActivity : BaseComposeActivityWithParcelable<PhotoViewData>() {
Box(modifier = Modifier.fillMaxSize()) { Box(modifier = Modifier.fillMaxSize()) {
HorizontalPager( HorizontalPager(
state = pagerState, state = pagerState,
key = { "${items[it].picId}_${items[it].overallIndex}" } key = { "${items[it].picId}_${items[it].postId}" }
) { ) {
val item = items[it] val item = items[it]
ViewPhoto( ViewPhoto(

View File

@ -41,6 +41,17 @@ class PhotoViewViewModel :
.flatMapConcat { it.producePartialChange() }, .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> = private fun PhotoViewUiIntent.LoadPrev.producePartialChange(): Flow<PhotoViewPartialChange.LoadPrev> =
TiebaApi.getInstance() TiebaApi.getInstance()
.picPageFlow( .picPageFlow(
@ -54,14 +65,7 @@ class PhotoViewViewModel :
prev = true prev = true
) )
.map<PicPageBean, PhotoViewPartialChange.LoadPrev> { picPageBean -> .map<PicPageBean, PhotoViewPartialChange.LoadPrev> { picPageBean ->
val items = picPageBean.picList.map { val items = picPageBean.picList.toPhotoViewItems()
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 hasPrev = items.first().overallIndex > 1 val hasPrev = items.first().overallIndex > 1
PhotoViewPartialChange.LoadPrev.Success( PhotoViewPartialChange.LoadPrev.Success(
hasPrev = hasPrev, hasPrev = hasPrev,
@ -87,14 +91,7 @@ class PhotoViewViewModel :
prev = false prev = false
) )
.map<PicPageBean, PhotoViewPartialChange.LoadMore> { picPageBean -> .map<PicPageBean, PhotoViewPartialChange.LoadMore> { picPageBean ->
val items = picPageBean.picList.map { val items = picPageBean.picList.toPhotoViewItems()
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 hasNext = items.last().overallIndex < picPageBean.picAmount.toInt() val hasNext = items.last().overallIndex < picPageBean.picAmount.toInt()
PhotoViewPartialChange.LoadMore.Success( PhotoViewPartialChange.LoadMore.Success(
hasNext = hasNext, hasNext = hasNext,
@ -115,7 +112,8 @@ class PhotoViewViewModel :
picId = item.picId, picId = item.picId,
originUrl = item.originUrl, originUrl = item.originUrl,
url = if (item.showOriginBtn) item.url else null, url = if (item.showOriginBtn) item.url else null,
overallIndex = index + 1 overallIndex = index + 1,
postId = item.postId
) )
}, },
hasNext = false, hasNext = false,
@ -139,14 +137,7 @@ class PhotoViewViewModel :
) )
.map<PicPageBean, PhotoViewPartialChange.Init> { picPageBean -> .map<PicPageBean, PhotoViewPartialChange.Init> { picPageBean ->
val picAmount = picPageBean.picAmount.toInt() val picAmount = picPageBean.picAmount.toInt()
val fetchedItems = picPageBean.picList.map { val fetchedItems = picPageBean.picList.toPhotoViewItems()
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 firstItemIndex = fetchedItems.first().overallIndex val firstItemIndex = fetchedItems.first().overallIndex
val localItems = val localItems =
if (data.data.picIndex == 1) emptyList() else data.picItems.subList( if (data.data.picIndex == 1) emptyList() else data.picItems.subList(
@ -157,7 +148,8 @@ class PhotoViewViewModel :
picId = item.picId, picId = item.picId,
originUrl = item.originUrl, originUrl = item.originUrl,
url = if (item.showOriginBtn) item.url else null, 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 val items = localItems + fetchedItems
@ -324,5 +316,6 @@ data class PhotoViewItem(
val picId: String, val picId: String,
val originUrl: String, val originUrl: String,
val url: String?, val url: String?,
val overallIndex: Int val overallIndex: Int,
val postId: Long? = null,
) )

View File

@ -39,7 +39,8 @@ fun getPhotoViewData(
url = picUrl, url = picUrl,
originUrl = originUrl, originUrl = originUrl,
showOriginBtn = showOriginBtn, showOriginBtn = showOriginBtn,
originSize = originSize originSize = originSize,
postId = post.id
) )
) )
) )
@ -85,7 +86,8 @@ fun getPhotoViewData(
url = mediaItem.bigPic, url = mediaItem.bigPic,
originUrl = mediaItem.originPic, originUrl = mediaItem.originPic,
showOriginBtn = mediaItem.showOriginalBtn == 1, showOriginBtn = mediaItem.showOriginalBtn == 1,
originSize = mediaItem.originSize originSize = mediaItem.originSize,
postId = mediaItem.postId
) )
}.toImmutableList(), }.toImmutableList(),
index = index index = index