@@ -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