回退 gridHeightPx/calendarAreaHeightPx/cardHeightPx 的 derivedStateOf

derivedStateOf 导致快照时序问题:cardHeightPx 计算时 gridHeightPx
尚未更新(仍为 0),calendarAreaHeightPx 极小,cardHeightPx 占 96% 屏幕,
BottomCard 遮挡整个日历。改回直接计算确保同一帧内值一致。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
xfy 2026-05-18 15:23:34 +08:00
parent 0962d13216
commit b2284c3986

View File

@ -61,6 +61,7 @@ import kotlinx.datetime.todayIn
import plus.rua.project.CalendarViewModel import plus.rua.project.CalendarViewModel
import kotlin.math.abs import kotlin.math.abs
import kotlin.time.Clock import kotlin.time.Clock
import android.util.Log
/** /**
* 日历主界面包含月/周视图切换折叠动画和年视图缩放转场 * 日历主界面包含月/周视图切换折叠动画和年视图缩放转场
@ -168,38 +169,35 @@ fun CalendarMonthView(
val cellWidth = (screenWidthPx - horizontalPaddingPx) / 7 val cellWidth = (screenWidthPx - horizontalPaddingPx) / 7
(cellWidth + rowPadding2Px).toInt() (cellWidth + rowPadding2Px).toInt()
} else 0 } else 0
Log.d("CalLayout", "estimatedRow=$estimatedRowHeightPx screenW=$screenWidthPx screenH=$screenHeightPx")
val effectiveRowHeightPx = if (rowHeightPx > 0) rowHeightPx else estimatedRowHeightPx val effectiveRowHeightPx = if (rowHeightPx > 0) rowHeightPx else estimatedRowHeightPx
val effectiveWeeks = interpolatedWeeks val effectiveWeeks = interpolatedWeeks
val gridHeightPx by remember { val gridHeightPx = if (effectiveRowHeightPx > 0) {
derivedStateOf { val rowH = effectiveRowHeightPx.toFloat()
if (effectiveRowHeightPx > 0) { if (collapseProgress > OFFSET_FRACTION_THRESHOLD) {
val rowH = effectiveRowHeightPx.toFloat() (rowH * (1 + (effectiveWeeks - 1) * (1f - collapseProgress))).toInt()
if (collapseProgress > OFFSET_FRACTION_THRESHOLD) { } else {
(rowH * (1 + (effectiveWeeks - 1) * (1f - collapseProgress))).toInt() (rowH * effectiveWeeks).toInt()
} else {
(rowH * effectiveWeeks).toInt()
}
} else 0
} }
} } else 0
Log.d("CalLayout", "gridHeightPx=$gridHeightPx rowH=$effectiveRowHeightPx weeks=$effectiveWeeks collapse=$collapseProgress")
val calendarAreaHeightPx by remember { val calendarAreaHeightPx = headerHeightPx + gridHeightPx + rowPaddingPx + cardGapPx
derivedStateOf { headerHeightPx + gridHeightPx + rowPaddingPx + cardGapPx } Log.d("CalLayout", "calendarArea=$calendarAreaHeightPx header=$headerHeightPx grid=$gridHeightPx rowPad=$rowPaddingPx cardGap=$cardGapPx")
}
val cardHeightPx by remember { val cardHeightPx =
derivedStateOf { if (screenHeightPx > 0 && calendarAreaHeightPx > 0) screenHeightPx - calendarAreaHeightPx else 0
if (screenHeightPx > 0 && calendarAreaHeightPx > 0) screenHeightPx - calendarAreaHeightPx else 0 Log.d("CalLayout", "cardHeight=$cardHeightPx screenH=$screenHeightPx calArea=$calendarAreaHeightPx")
}
}
val pagerModifier = if (rowHeightPx > 0 && gridHeightPx > 0) { val pagerModifier = if (rowHeightPx > 0 && gridHeightPx > 0) {
Log.d("CalLayout", "pagerModifier: height=${with(density) { gridHeightPx.toDp() }} rowH=$rowHeightPx gridH=$gridHeightPx")
Modifier Modifier
.height(with(density) { gridHeightPx.toDp() }) .height(with(density) { gridHeightPx.toDp() })
.clipToBounds() .clipToBounds()
} else { } else {
Log.d("CalLayout", "pagerModifier: EMPTY rowH=$rowHeightPx gridH=$gridHeightPx")
Modifier Modifier
} }
@ -320,6 +318,7 @@ fun CalendarMonthView(
} }
if (cardHeightPx > 0) { if (cardHeightPx > 0) {
Log.d("CalLayout", "BottomCard: height=${with(density) { cardHeightPx.toDp() }} cardH=$cardHeightPx isCollapsed=${viewModel.isCollapsed}")
BottomCard( BottomCard(
viewModel = viewModel, viewModel = viewModel,
dragRangePx = dragRangePx, dragRangePx = dragRangePx,