Skip to content

Commit 5a403dc

Browse files
committed
fix: Switch crash with off state.
1 parent b6a00df commit 5a403dc

File tree

1 file changed

+19
-16
lines changed
  • miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/basic

1 file changed

+19
-16
lines changed

miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/basic/Switch.kt

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ fun Switch(
6868
colors: SwitchColors = SwitchDefaults.switchColors(),
6969
enabled: Boolean = true
7070
) {
71+
val isChecked by rememberUpdatedState(checked)
7172
val currentOnCheckedChange by rememberUpdatedState(onCheckedChange)
7273

7374
val interactionSource = remember { MutableInteractionSource() }
@@ -79,14 +80,16 @@ fun Switch(
7980
var hasVibrated by remember { mutableStateOf(false) }
8081
var hasVibratedOnce by remember { mutableStateOf(false) }
8182

82-
val springSpec = spring<Dp>(
83-
dampingRatio = Spring.DampingRatioLowBouncy,
84-
stiffness = Spring.StiffnessMedium
85-
)
83+
val springSpec = remember {
84+
spring<Dp>(
85+
dampingRatio = Spring.DampingRatioLowBouncy,
86+
stiffness = Spring.StiffnessMedium
87+
)
88+
}
8689

8790
var dragOffset by remember { mutableStateOf(0f) }
8891
val thumbOffset by animateDpAsState(
89-
targetValue = if (checked) {
92+
targetValue = if (isChecked) {
9093
if (!enabled) 26.dp else if (isPressed || isDragged || isHovered) 24.dp else 26.dp
9194
} else {
9295
if (!enabled) 4.dp else if (isPressed || isDragged || isHovered) 3.dp else 4.dp
@@ -100,11 +103,11 @@ fun Switch(
100103
)
101104

102105
val thumbColor by animateColorAsState(
103-
if (checked) colors.checkedThumbColor(enabled) else colors.uncheckedThumbColor(enabled)
106+
if (isChecked) colors.checkedThumbColor(enabled) else colors.uncheckedThumbColor(enabled)
104107
)
105108

106109
val backgroundColor by animateColorAsState(
107-
if (checked) colors.checkedTrackColor(enabled) else colors.uncheckedTrackColor(enabled),
110+
if (isChecked) colors.checkedTrackColor(enabled) else colors.uncheckedTrackColor(enabled),
108111
animationSpec = tween(durationMillis = 200)
109112
)
110113

@@ -142,16 +145,16 @@ fun Switch(
142145
} while (event.changes.all { it.pressed })
143146

144147
if (validHorizontalDrag && !isPressed && !isDragged) {
145-
currentOnCheckedChange?.invoke(!checked)
148+
currentOnCheckedChange?.invoke(!isChecked)
146149
hapticFeedback.performHapticFeedback(
147-
if (checked) HapticFeedbackType.ToggleOff
150+
if (isChecked) HapticFeedbackType.ToggleOff
148151
else HapticFeedbackType.ToggleOn
149152
)
150153
}
151154
}
152155
}
153156
.toggleable(
154-
value = checked,
157+
value = isChecked,
155158
onValueChange = {
156159
if (currentOnCheckedChange == null) return@toggleable
157160
currentOnCheckedChange?.invoke(it)
@@ -201,11 +204,11 @@ fun Switch(
201204
hasVibratedOnce = false
202205
},
203206
onDragEnd = {
204-
if (dragOffset.absoluteValue > 21f / 2) currentOnCheckedChange?.invoke(!checked)
207+
if (dragOffset.absoluteValue > 21f / 2) currentOnCheckedChange?.invoke(!isChecked)
205208
if (!hasVibratedOnce && dragOffset.absoluteValue >= 1f) {
206-
if ((checked && dragOffset <= -11f) || (!checked && dragOffset <= 10f)) {
209+
if ((isChecked && dragOffset <= -11f) || (!isChecked && dragOffset <= 10f)) {
207210
hapticFeedback.performHapticFeedback(HapticFeedbackType.ToggleOff)
208-
} else if ((checked && dragOffset >= -10f) || (!checked && dragOffset >= 11f)) {
211+
} else if ((isChecked && dragOffset >= -10f) || (!isChecked && dragOffset >= 11f)) {
209212
hapticFeedback.performHapticFeedback(HapticFeedbackType.ToggleOn)
210213
}
211214
}
@@ -218,18 +221,18 @@ fun Switch(
218221
}
219222
) { _, dragAmount ->
220223
dragOffset = (dragOffset + dragAmount / 2).let {
221-
if (checked) it.coerceIn(-21f, 0f) else it.coerceIn(0f, 21f)
224+
if (isChecked) it.coerceIn(-21f, 0f) else it.coerceIn(0f, 21f)
222225
}
223226
if (dragOffset in -11f..-10f || dragOffset in 10f..11f) {
224227
hasVibratedOnce = false
225228
} else if (dragOffset in -20f..-1f || dragOffset in 1f..20f) {
226229
hasVibrated = false
227230
} else if (!hasVibrated) {
228-
if ((checked && dragOffset == -21f) || (!checked && dragOffset == 0f)) {
231+
if ((isChecked && dragOffset == -21f) || (!isChecked && dragOffset == 0f)) {
229232
hapticFeedback.performHapticFeedback(HapticFeedbackType.ToggleOff)
230233
hasVibrated = true
231234
hasVibratedOnce = true
232-
} else if ((checked && dragOffset == 0f) || (!checked && dragOffset == 21f)) {
235+
} else if ((isChecked && dragOffset == 0f) || (!isChecked && dragOffset == 21f)) {
233236
hapticFeedback.performHapticFeedback(HapticFeedbackType.ToggleOn)
234237
hasVibrated = true
235238
hasVibratedOnce = true

0 commit comments

Comments
 (0)