fix: 查看大图时闪烁第一张图
This commit is contained in:
parent
65af5656fb
commit
6ad018c6f1
|
|
@ -25,6 +25,7 @@ data class PicItem(
|
|||
val originUrl: String,
|
||||
val showOriginBtn: Boolean,
|
||||
val originSize: Int,
|
||||
val postId: Long? = null,
|
||||
) : Parcelable
|
||||
|
||||
@Immutable
|
||||
|
|
|
|||
|
|
@ -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<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 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<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(
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue