Skip to content

Commit 4495a65

Browse files
authored
library: Fix a crash issue on Switch (#95)
* fix: Switch crash with off state. * fix: Switch crash with off state.
1 parent b6a00df commit 4495a65

File tree

1 file changed

+13
-12
lines changed
  • miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/basic

1 file changed

+13
-12
lines changed

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

Lines changed: 13 additions & 12 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() }
@@ -86,7 +87,7 @@ fun Switch(
8687

8788
var dragOffset by remember { mutableStateOf(0f) }
8889
val thumbOffset by animateDpAsState(
89-
targetValue = if (checked) {
90+
targetValue = if (isChecked) {
9091
if (!enabled) 26.dp else if (isPressed || isDragged || isHovered) 24.dp else 26.dp
9192
} else {
9293
if (!enabled) 4.dp else if (isPressed || isDragged || isHovered) 3.dp else 4.dp
@@ -100,11 +101,11 @@ fun Switch(
100101
)
101102

102103
val thumbColor by animateColorAsState(
103-
if (checked) colors.checkedThumbColor(enabled) else colors.uncheckedThumbColor(enabled)
104+
if (isChecked) colors.checkedThumbColor(enabled) else colors.uncheckedThumbColor(enabled)
104105
)
105106

106107
val backgroundColor by animateColorAsState(
107-
if (checked) colors.checkedTrackColor(enabled) else colors.uncheckedTrackColor(enabled),
108+
if (isChecked) colors.checkedTrackColor(enabled) else colors.uncheckedTrackColor(enabled),
108109
animationSpec = tween(durationMillis = 200)
109110
)
110111

@@ -142,16 +143,16 @@ fun Switch(
142143
} while (event.changes.all { it.pressed })
143144

144145
if (validHorizontalDrag && !isPressed && !isDragged) {
145-
currentOnCheckedChange?.invoke(!checked)
146+
currentOnCheckedChange?.invoke(!isChecked)
146147
hapticFeedback.performHapticFeedback(
147-
if (checked) HapticFeedbackType.ToggleOff
148+
if (isChecked) HapticFeedbackType.ToggleOff
148149
else HapticFeedbackType.ToggleOn
149150
)
150151
}
151152
}
152153
}
153154
.toggleable(
154-
value = checked,
155+
value = isChecked,
155156
onValueChange = {
156157
if (currentOnCheckedChange == null) return@toggleable
157158
currentOnCheckedChange?.invoke(it)
@@ -201,11 +202,11 @@ fun Switch(
201202
hasVibratedOnce = false
202203
},
203204
onDragEnd = {
204-
if (dragOffset.absoluteValue > 21f / 2) currentOnCheckedChange?.invoke(!checked)
205+
if (dragOffset.absoluteValue > 21f / 2) currentOnCheckedChange?.invoke(!isChecked)
205206
if (!hasVibratedOnce && dragOffset.absoluteValue >= 1f) {
206-
if ((checked && dragOffset <= -11f) || (!checked && dragOffset <= 10f)) {
207+
if ((isChecked && dragOffset <= -11f) || (!isChecked && dragOffset <= 10f)) {
207208
hapticFeedback.performHapticFeedback(HapticFeedbackType.ToggleOff)
208-
} else if ((checked && dragOffset >= -10f) || (!checked && dragOffset >= 11f)) {
209+
} else if ((isChecked && dragOffset >= -10f) || (!isChecked && dragOffset >= 11f)) {
209210
hapticFeedback.performHapticFeedback(HapticFeedbackType.ToggleOn)
210211
}
211212
}
@@ -218,18 +219,18 @@ fun Switch(
218219
}
219220
) { _, dragAmount ->
220221
dragOffset = (dragOffset + dragAmount / 2).let {
221-
if (checked) it.coerceIn(-21f, 0f) else it.coerceIn(0f, 21f)
222+
if (isChecked) it.coerceIn(-21f, 0f) else it.coerceIn(0f, 21f)
222223
}
223224
if (dragOffset in -11f..-10f || dragOffset in 10f..11f) {
224225
hasVibratedOnce = false
225226
} else if (dragOffset in -20f..-1f || dragOffset in 1f..20f) {
226227
hasVibrated = false
227228
} else if (!hasVibrated) {
228-
if ((checked && dragOffset == -21f) || (!checked && dragOffset == 0f)) {
229+
if ((isChecked && dragOffset == -21f) || (!isChecked && dragOffset == 0f)) {
229230
hapticFeedback.performHapticFeedback(HapticFeedbackType.ToggleOff)
230231
hasVibrated = true
231232
hasVibratedOnce = true
232-
} else if ((checked && dragOffset == 0f) || (!checked && dragOffset == 21f)) {
233+
} else if ((isChecked && dragOffset == 0f) || (!isChecked && dragOffset == 21f)) {
233234
hapticFeedback.performHapticFeedback(HapticFeedbackType.ToggleOn)
234235
hasVibrated = true
235236
hasVibratedOnce = true

0 commit comments

Comments
 (0)