fix: 查看大图时闪烁第一张图
This commit is contained in:
parent
65af5656fb
commit
6ad018c6f1
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
)
|
)
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue