fix: 修复年视图翻页后共享元素转场动画失效

- 移除 baseYearForPager 和 scrollToPage(START_PAGE)
- HorizontalPager 的 pageYear 改用 yearViewYear + 相对偏移计算
- snapshotFlow 改为跟踪 settled page 差值更新 yearViewYear
- 避免再次进入年视图时强制滚动导致动画期间重组

Fixes #8

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
xfy 2026-05-22 15:46:50 +08:00
parent ca02784d39
commit 2fc89d08c7
2 changed files with 13 additions and 19 deletions

View File

@ -208,6 +208,10 @@ class CalendarViewModel(
_yearViewYear.value = _yearViewYear.value - 1
}
fun setYearViewYear(year: Int) {
_yearViewYear.value = year
}
/**
* 展开状态下拖拽折叠delta 正值推动 progress 1折叠方向
*

View File

@ -123,6 +123,7 @@ fun CalendarMonthView(
var rowHeightPx by remember { mutableIntStateOf(0) }
var screenWidthPx by remember { mutableIntStateOf(0) }
var isMenuExpanded by remember { mutableStateOf(false) }
// 视图切换时自动关闭菜单
LaunchedEffect(isYearView) {
isMenuExpanded = false
@ -136,26 +137,15 @@ fun CalendarMonthView(
pageCount = { Int.MAX_VALUE }
)
// 进入年视图时同步 yearPagerState 到当前年
LaunchedEffect(isYearView) {
if (isYearView) {
if (yearPagerState.currentPage != START_PAGE) {
yearPagerState.scrollToPage(START_PAGE)
}
}
}
// 年视图翻页时同步 yearViewYear
// 年视图翻页时同步 yearViewYear跟踪 settled page 差值)
LaunchedEffect(yearPagerState) {
var lastSettledPage = yearPagerState.currentPage
snapshotFlow { yearPagerState.settledPage }.collect { page ->
val offset = page - START_PAGE
val targetYear = selectedDate.year + offset
if (targetYear != yearViewYear) {
if (targetYear > yearViewYear) {
viewModel.incrementYear()
} else {
viewModel.decrementYear()
}
if (page != lastSettledPage) {
val diff = page - lastSettledPage
val newYear = viewModel.yearViewYear.value + diff
viewModel.setYearViewYear(newYear)
lastSettledPage = page
}
}
}
@ -299,7 +289,7 @@ fun CalendarMonthView(
} else {
pageOffset
}
val pageYear = selectedDate.year + (page - START_PAGE)
val pageYear = yearViewYear + (page - yearPagerState.currentPage)
YearGridView(
year = pageYear,
selectedMonth = if (pageYear == currentYear) currentMonth else 0,