From 2fc89d08c789c425b2c0bb46e7e8721c33c650b5 Mon Sep 17 00:00:00 2001 From: xfy Date: Fri, 22 May 2026 15:46:50 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=B9=B4=E8=A7=86?= =?UTF-8?q?=E5=9B=BE=E7=BF=BB=E9=A1=B5=E5=90=8E=E5=85=B1=E4=BA=AB=E5=85=83?= =?UTF-8?q?=E7=B4=A0=E8=BD=AC=E5=9C=BA=E5=8A=A8=E7=94=BB=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 baseYearForPager 和 scrollToPage(START_PAGE) - HorizontalPager 的 pageYear 改用 yearViewYear + 相对偏移计算 - snapshotFlow 改为跟踪 settled page 差值更新 yearViewYear - 避免再次进入年视图时强制滚动导致动画期间重组 Fixes #8 Co-Authored-By: Claude Opus 4.7 (1M context) --- .../plus/rua/project/CalendarViewModel.kt | 4 +++ .../plus/rua/project/ui/CalendarMonthView.kt | 28 ++++++------------- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/core/src/main/kotlin/plus/rua/project/CalendarViewModel.kt b/core/src/main/kotlin/plus/rua/project/CalendarViewModel.kt index 22655ab..9f838bd 100644 --- a/core/src/main/kotlin/plus/rua/project/CalendarViewModel.kt +++ b/core/src/main/kotlin/plus/rua/project/CalendarViewModel.kt @@ -208,6 +208,10 @@ class CalendarViewModel( _yearViewYear.value = _yearViewYear.value - 1 } + fun setYearViewYear(year: Int) { + _yearViewYear.value = year + } + /** * 展开状态下拖拽折叠,delta 正值推动 progress 向 1(折叠方向)。 * diff --git a/core/src/main/kotlin/plus/rua/project/ui/CalendarMonthView.kt b/core/src/main/kotlin/plus/rua/project/ui/CalendarMonthView.kt index cd1fdb4..91ee412 100644 --- a/core/src/main/kotlin/plus/rua/project/ui/CalendarMonthView.kt +++ b/core/src/main/kotlin/plus/rua/project/ui/CalendarMonthView.kt @@ -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,