修复折叠态跨月周选中和展开闪跳问题
1. 展开同步逻辑移至 CalendarPager(LaunchedEffect(Unit)),减少闪帧 2. 跨月周根据滑动方向选中日期: - 后退到跨月周:选较晚月份1号,留在当月 - 前进到跨月周:选该周周一,留在上个月
This commit is contained in:
parent
09e13e335c
commit
fcad070800
@ -9,7 +9,6 @@ import androidx.compose.foundation.layout.padding
|
|||||||
import androidx.compose.foundation.layout.statusBarsPadding
|
import androidx.compose.foundation.layout.statusBarsPadding
|
||||||
import androidx.compose.foundation.pager.rememberPagerState
|
import androidx.compose.foundation.pager.rememberPagerState
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
|
||||||
import androidx.compose.runtime.derivedStateOf
|
import androidx.compose.runtime.derivedStateOf
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableIntStateOf
|
import androidx.compose.runtime.mutableIntStateOf
|
||||||
@ -61,22 +60,6 @@ fun CalendarMonthView(
|
|||||||
|
|
||||||
val pagerState = rememberPagerState(initialPage = START_PAGE, pageCount = { Int.MAX_VALUE })
|
val pagerState = rememberPagerState(initialPage = START_PAGE, pageCount = { Int.MAX_VALUE })
|
||||||
|
|
||||||
// 展开时同步 CalendarPager 页面到 selectedDate 所在月份
|
|
||||||
LaunchedEffect(viewModel.isCollapsed) {
|
|
||||||
if (!viewModel.isCollapsed) {
|
|
||||||
@Suppress("DEPRECATION") // monthNumber 无替代 API
|
|
||||||
val targetPage = yearMonthToPage(
|
|
||||||
viewModel.selectedDate.year,
|
|
||||||
viewModel.selectedDate.month.number,
|
|
||||||
today.year,
|
|
||||||
today.month.number
|
|
||||||
)
|
|
||||||
if (targetPage != pagerState.currentPage) {
|
|
||||||
pagerState.scrollToPage(targetPage)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val collapseProgress = viewModel.collapseProgress
|
val collapseProgress = viewModel.collapseProgress
|
||||||
val headerHeightPx = monthHeaderHeightPx + weekdayHeaderHeightPx
|
val headerHeightPx = monthHeaderHeightPx + weekdayHeaderHeightPx
|
||||||
val rowPaddingPx = with(density) { ROW_PADDING_DP.dp.toPx() }.toInt()
|
val rowPaddingPx = with(density) { ROW_PADDING_DP.dp.toPx() }.toInt()
|
||||||
@ -179,9 +162,21 @@ fun CalendarMonthView(
|
|||||||
today = today,
|
today = today,
|
||||||
onDateClick = { date -> viewModel.selectDate(date) },
|
onDateClick = { date -> viewModel.selectDate(date) },
|
||||||
onWeekChanged = { weekMonday ->
|
onWeekChanged = { weekMonday ->
|
||||||
// 优先选中当周内的今天,否则选中该周周一
|
|
||||||
val weekSunday = weekMonday.plus(DatePeriod(days = 6))
|
val weekSunday = weekMonday.plus(DatePeriod(days = 6))
|
||||||
val date = if (today in weekMonday..weekSunday) today else weekMonday
|
val date = when {
|
||||||
|
today in weekMonday..weekSunday -> today
|
||||||
|
weekMonday.month != weekSunday.month -> {
|
||||||
|
if (weekMonday < viewModel.selectedDate) {
|
||||||
|
// 后退到跨月周(如从5月回到4月27-5月3):选较晚月份1号,留在当月
|
||||||
|
@Suppress("DEPRECATION") // monthNumber 无替代 API
|
||||||
|
LocalDate(weekSunday.year, weekSunday.month.number, 1)
|
||||||
|
} else {
|
||||||
|
// 前进到跨月周(如从4月前进到4月27-5月3):选该周周一,留在上个月
|
||||||
|
weekMonday
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else -> weekMonday
|
||||||
|
}
|
||||||
viewModel.selectDate(date)
|
viewModel.selectDate(date)
|
||||||
},
|
},
|
||||||
modifier = pagerModifier
|
modifier = pagerModifier
|
||||||
|
|||||||
@ -52,6 +52,17 @@ fun CalendarPager(
|
|||||||
val initialMonth = remember { today.month.number }
|
val initialMonth = remember { today.month.number }
|
||||||
val coroutineScope = rememberCoroutineScope()
|
val coroutineScope = rememberCoroutineScope()
|
||||||
|
|
||||||
|
// 展开后同步页面到 selectedDate 所在月份(修复折叠态切月后展开闪跳)
|
||||||
|
LaunchedEffect(Unit) {
|
||||||
|
@Suppress("DEPRECATION") // monthNumber 无替代 API
|
||||||
|
val targetPage = yearMonthToPage(
|
||||||
|
selectedDate.year, selectedDate.month.number, initialYear, initialMonth
|
||||||
|
)
|
||||||
|
if (targetPage != pagerState.currentPage) {
|
||||||
|
pagerState.scrollToPage(targetPage)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 跳过初始发射,保留首次渲染时的"今天"选中状态
|
// 跳过初始发射,保留首次渲染时的"今天"选中状态
|
||||||
LaunchedEffect(pagerState) {
|
LaunchedEffect(pagerState) {
|
||||||
snapshotFlow { pagerState.settledPage }.drop(1).collect { page ->
|
snapshotFlow { pagerState.settledPage }.drop(1).collect { page ->
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user