Skip to content

Commit 959474f

Browse files
authored
Lint: Use specialized state holders to avoid autoboxing (#591)
* Perf: Use specialized state holders to avoid autoboxing The lint tool reported "AutoboxingStateCreation" warnings in multiple files. Using the generic `mutableStateOf` for primitive types (Int, Float, Long) can lead to performance overhead due to autoboxing. This commit resolves these warnings by replacing `mutableStateOf` with its specialized, more performant counterparts (`mutableIntStateOf`, `mutableFloatStateOf`, `mutableLongStateOf`) where applicable. This change improves performance by avoiding unnecessary object allocations for primitive state values.
1 parent d6d74ed commit 959474f

File tree

9 files changed

+27
-20
lines changed

9 files changed

+27
-20
lines changed

compose/snippets/src/main/java/com/example/compose/snippets/components/Badges.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import androidx.compose.material3.Icon
3030
import androidx.compose.material3.Text
3131
import androidx.compose.runtime.Composable
3232
import androidx.compose.runtime.getValue
33-
import androidx.compose.runtime.mutableStateOf
33+
import androidx.compose.runtime.mutableIntStateOf
3434
import androidx.compose.runtime.remember
3535
import androidx.compose.runtime.setValue
3636
import androidx.compose.ui.Alignment
@@ -78,7 +78,7 @@ fun BadgeExample() {
7878
// [START android_compose_components_badgeinteractive]
7979
@Composable
8080
fun BadgeInteractiveExample() {
81-
var itemCount by remember { mutableStateOf(0) }
81+
var itemCount by remember { mutableIntStateOf(0) }
8282

8383
Column(
8484
verticalArrangement = Arrangement.spacedBy(16.dp)

compose/snippets/src/main/java/com/example/compose/snippets/components/ProgressIndicator.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import androidx.compose.material3.MaterialTheme
2929
import androidx.compose.material3.Text
3030
import androidx.compose.runtime.Composable
3131
import androidx.compose.runtime.getValue
32+
import androidx.compose.runtime.mutableFloatStateOf
3233
import androidx.compose.runtime.mutableStateOf
3334
import androidx.compose.runtime.remember
3435
import androidx.compose.runtime.rememberCoroutineScope
@@ -65,7 +66,7 @@ fun ProgressIndicatorExamples() {
6566
// [START android_compose_components_determinateindicator]
6667
@Composable
6768
fun LinearDeterminateIndicator() {
68-
var currentProgress by remember { mutableStateOf(0f) }
69+
var currentProgress by remember { mutableFloatStateOf(0f) }
6970
var loading by remember { mutableStateOf(false) }
7071
val scope = rememberCoroutineScope() // Create a coroutine scope
7172

@@ -107,7 +108,7 @@ suspend fun loadProgress(updateProgress: (Float) -> Unit) {
107108
@Preview
108109
@Composable
109110
fun CircularDeterminateIndicator() {
110-
var currentProgress by remember { mutableStateOf(0f) }
111+
var currentProgress by remember { mutableFloatStateOf(0f) }
111112
var loading by remember { mutableStateOf(false) }
112113
val scope = rememberCoroutineScope() // Create a coroutine scope
113114

compose/snippets/src/main/java/com/example/compose/snippets/glance/GlanceSnippets.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import androidx.compose.material3.ColorScheme
3434
import androidx.compose.runtime.Composable
3535
import androidx.compose.runtime.collectAsState
3636
import androidx.compose.runtime.getValue
37+
import androidx.compose.runtime.mutableIntStateOf
3738
import androidx.compose.runtime.mutableStateOf
3839
import androidx.compose.runtime.remember
3940
import androidx.compose.runtime.rememberCoroutineScope
@@ -655,7 +656,7 @@ object CompoundButton {
655656
// [START android_compose_glance_buildUI12]
656657
var isApplesChecked by remember { mutableStateOf(false) }
657658
var isEnabledSwitched by remember { mutableStateOf(false) }
658-
var isRadioChecked by remember { mutableStateOf(0) }
659+
var isRadioChecked by remember { mutableIntStateOf(0) }
659660

660661
CheckBox(
661662
checked = isApplesChecked,

compose/snippets/src/main/java/com/example/compose/snippets/interop/InteroperabilityAPIsSnippets.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import androidx.compose.material3.Text
3838
import androidx.compose.runtime.Composable
3939
import androidx.compose.runtime.DisposableEffect
4040
import androidx.compose.runtime.getValue
41-
import androidx.compose.runtime.mutableStateOf
41+
import androidx.compose.runtime.mutableIntStateOf
4242
import androidx.compose.runtime.remember
4343
import androidx.compose.runtime.rememberUpdatedState
4444
import androidx.compose.runtime.setValue
@@ -194,7 +194,7 @@ class ExampleFragmentMultipleComposeView : Fragment() {
194194
// [START android_compose_interop_apis_views_in_compose]
195195
@Composable
196196
fun CustomView() {
197-
var selectedItem by remember { mutableStateOf(0) }
197+
var selectedItem by remember { mutableIntStateOf(0) }
198198

199199
// Adds view to Compose
200200
AndroidView(

compose/snippets/src/main/java/com/example/compose/snippets/layouts/FlowLayoutSnippets.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ import androidx.compose.material3.FilterChip
4545
import androidx.compose.material3.Text
4646
import androidx.compose.runtime.Composable
4747
import androidx.compose.runtime.getValue
48-
import androidx.compose.runtime.mutableStateOf
48+
import androidx.compose.runtime.mutableIntStateOf
4949
import androidx.compose.runtime.remember
5050
import androidx.compose.runtime.setValue
5151
import androidx.compose.ui.Alignment
@@ -472,7 +472,7 @@ fun ContextualFlowLayoutExample() {
472472
// [START android_compose_layouts_contextual_flow]
473473
val totalCount = 40
474474
var maxLines by remember {
475-
mutableStateOf(2)
475+
mutableIntStateOf(2)
476476
}
477477

478478
val moreOrCollapseIndicator = @Composable { scope: ContextualFlowRowOverflowScope ->

compose/snippets/src/main/java/com/example/compose/snippets/performance/PerformanceSnippets.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import androidx.compose.runtime.Composable
3636
import androidx.compose.runtime.State
3737
import androidx.compose.runtime.derivedStateOf
3838
import androidx.compose.runtime.getValue
39+
import androidx.compose.runtime.mutableIntStateOf
3940
import androidx.compose.runtime.mutableStateOf
4041
import androidx.compose.runtime.remember
4142
import androidx.compose.runtime.setValue
@@ -264,7 +265,7 @@ private object BackwardsWrite {
264265
// [START android_compose_performance_backwardswrite]
265266
@Composable
266267
fun BadComposable() {
267-
var count by remember { mutableStateOf(0) }
268+
var count by remember { mutableIntStateOf(0) }
268269

269270
// Causes recomposition on click
270271
Button(onClick = { count++ }, Modifier.wrapContentSize()) {

compose/snippets/src/main/java/com/example/compose/snippets/phases/PhasesSnippets.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import androidx.compose.material3.Text
3030
import androidx.compose.runtime.Composable
3131
import androidx.compose.runtime.MutableState
3232
import androidx.compose.runtime.getValue
33+
import androidx.compose.runtime.mutableIntStateOf
3334
import androidx.compose.runtime.mutableStateOf
3435
import androidx.compose.runtime.remember
3536
import androidx.compose.runtime.setValue
@@ -178,7 +179,7 @@ private object Loop {
178179
fun Loop() {
179180
// [START android_compose_phases_loop]
180181
Box {
181-
var imageHeightPx by remember { mutableStateOf(0) }
182+
var imageHeightPx by remember { mutableIntStateOf(0) }
182183

183184
Image(
184185
painter = painterResource(R.drawable.rectangle),

compose/snippets/src/main/java/com/example/compose/snippets/sideeffects/SideEffectsSnippets.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import androidx.compose.runtime.SideEffect
3636
import androidx.compose.runtime.State
3737
import androidx.compose.runtime.derivedStateOf
3838
import androidx.compose.runtime.getValue
39+
import androidx.compose.runtime.mutableLongStateOf
3940
import androidx.compose.runtime.mutableStateOf
4041
import androidx.compose.runtime.produceState
4142
import androidx.compose.runtime.remember
@@ -59,7 +60,7 @@ fun MyScreen() {
5960
// [START android_compose_side_effects_launchedeffect]
6061
// Allow the pulse rate to be configured, so it can be sped up if the user is running
6162
// out of time
62-
var pulseRateMs by remember { mutableStateOf(3000L) }
63+
var pulseRateMs by remember { mutableLongStateOf(3000L) }
6364
val alpha = remember { Animatable(1f) }
6465
LaunchedEffect(pulseRateMs) { // Restart the effect when the pulse rate changes
6566
while (isActive) {

compose/snippets/src/main/java/com/example/compose/snippets/touchinput/gestures/GesturesSnippets.kt

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ import androidx.compose.material3.Text
5252
import androidx.compose.runtime.Composable
5353
import androidx.compose.runtime.LaunchedEffect
5454
import androidx.compose.runtime.getValue
55+
import androidx.compose.runtime.mutableFloatStateOf
56+
import androidx.compose.runtime.mutableIntStateOf
5557
import androidx.compose.runtime.mutableStateOf
5658
import androidx.compose.runtime.remember
5759
import androidx.compose.runtime.setValue
@@ -77,7 +79,7 @@ import kotlin.math.roundToInt
7779
// [START android_compose_touchinput_gestures_clickable]
7880
@Composable
7981
private fun ClickableSample() {
80-
val count = remember { mutableStateOf(0) }
82+
val count = remember { mutableIntStateOf(0) }
8183
// content that you want to make clickable
8284
Text(
8385
text = count.value.toString(),
@@ -89,7 +91,7 @@ private fun ClickableSample() {
8991
@Preview
9092
@Composable
9193
private fun WithPointerInput() {
92-
val count = remember { mutableStateOf(0) }
94+
val count = remember { mutableIntStateOf(0) }
9395
// content that you want to make clickable
9496
Text(
9597
text = count.value.toString(),
@@ -151,7 +153,7 @@ private fun ScrollBoxesSmooth() {
151153
@Composable
152154
private fun ScrollableSample() {
153155
// actual composable state
154-
var offset by remember { mutableStateOf(0f) }
156+
var offset by remember { mutableFloatStateOf(0f) }
155157
Box(
156158
Modifier
157159
.size(150.dp)
@@ -249,7 +251,7 @@ private object NestedScrollInterop {
249251
// [START android_compose_touchinput_gestures_draggable]
250252
@Composable
251253
private fun DraggableText() {
252-
var offsetX by remember { mutableStateOf(0f) }
254+
var offsetX by remember { mutableFloatStateOf(0f) }
253255
Text(
254256
modifier = Modifier
255257
.offset { IntOffset(offsetX.roundToInt(), 0) }
@@ -268,8 +270,8 @@ private fun DraggableText() {
268270
@Composable
269271
private fun DraggableTextLowLevel() {
270272
Box(modifier = Modifier.fillMaxSize()) {
271-
var offsetX by remember { mutableStateOf(0f) }
272-
var offsetY by remember { mutableStateOf(0f) }
273+
var offsetX by remember { mutableFloatStateOf(0f) }
274+
var offsetY by remember { mutableFloatStateOf(0f) }
273275

274276
Box(
275277
Modifier
@@ -324,8 +326,8 @@ private fun SwipeableSample() {
324326
@Composable
325327
private fun TransformableSample() {
326328
// set up all transformation states
327-
var scale by remember { mutableStateOf(1f) }
328-
var rotation by remember { mutableStateOf(0f) }
329+
var scale by remember { mutableFloatStateOf(1f) }
330+
var rotation by remember { mutableFloatStateOf(0f) }
329331
var offset by remember { mutableStateOf(Offset.Zero) }
330332
val state = rememberTransformableState { zoomChange, offsetChange, rotationChange ->
331333
scale *= zoomChange

0 commit comments

Comments
 (0)