Skip to content

Instantly share code, notes, and snippets.

View Skyyo's full-sized avatar
🇺🇦

Denis Rudenko Skyyo

🇺🇦
View GitHub Profile
@Skyyo
Skyyo / collectAsImmutableWithLifecycle.kt
Last active September 19, 2023 10:41
extension to convert collections & 3d party objects into immutable types on UI layer until Compose has a better solution
@file:OptIn(ExperimentalLifecycleComposeApi::class)
package com.skyyo.template.utils.extensions
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable
import androidx.compose.runtime.State
import androidx.compose.runtime.produceState
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.lifecycle.Lifecycle
DisposableEffect(exoPlayer) {
val lifecycleObserver = LifecycleEventObserver { _, event ->
if (playingItemIndex == null) return@LifecycleEventObserver
when (event) {
Lifecycle.Event.ON_START -> exoPlayer.play()
Lifecycle.Event.ON_STOP -> exoPlayer.pause()
}
}
lifecycleOwner.lifecycle.addObserver(lifecycleObserver)
@Skyyo
Skyyo / perf_snippet_10.kt
Last active October 7, 2022 19:49
perf_snippet_10
@Immutable
class ImmutableListWrapper(val items: List<Int>)
// optimized using @Immutable marked ImmutableWrapper
@Composable
private fun WrappedLazyColumnApproach1(wrapper: ImmutableListWrapper) {
LazyColumn {
items(items = wrapper.items, key = { item -> item }) { item ->
Text(text = "item $item")
}
@Skyyo
Skyyo / perf_snippet_19.kt
Last active October 4, 2022 08:57
perf_snippet_19
@Composable
fun StateReadsLowerStateReadsOptimizedScreen(viewModel: TypicalViewModel = hiltViewModel()) {
ColumnWrapper {
InputsWrapper(
nameStateFlow = viewModel.name,
creditCardNumberStateFlow = viewModel.creditCardNumber,
onNameEntered = viewModel::onNameEntered,
onCreditCardNumberEntered = viewModel::onCardNumberEntered
)
}
@Skyyo
Skyyo / perf_snippet_15.kt
Last active October 4, 2022 08:55
perf_snippet_15
@Composable
fun StateReadsInputLambdasScreen(viewModel: TypicalViewModel = hiltViewModel()) {
val name by viewModel.name.collectAsStateWithLifecycle()
val creditCardNumber by viewModel.creditCardNumber.collectAsStateWithLifecycle()
Column {
InputsWrapper(
name = name,
creditCardNumber = creditCardNumber,
onNameEntered = viewModel::onNameEntered,
@Skyyo
Skyyo / perf_snippet_2.kt
Last active October 4, 2022 07:42
perf_snippet_2
restartable scheme("[androidx.compose.ui.UiComposable]") fun UserDetails(
unstable user: User
)
@Skyyo
Skyyo / perf_snippet_21.kt
Created October 2, 2022 18:06
perf_snippet_21
@Composable
private fun HorizontallyMovingButton(scrollProvider: () -> Float) {
Button(modifier = Modifier.graphicsLayer { translationX = scrollProvider() })
}
@Skyyo
Skyyo / perf_snippet_20.kt
Created October 2, 2022 18:00
perf_snippet_20
@Composable
fun ModifierLambdasScreen() {
val scrollState = rememberScrollState()
BoxWrapper {
ScrollingArea(scrollState)
HorizontallyMovingButton(scrollState.value * 1.5f)
}
}
@Composable
@Skyyo
Skyyo / perf_snippet_18.kt
Created October 2, 2022 16:46
perf_snippet_18
@Composable
@NonRestartableComposable
private fun InputsWrapperAnnotation(
name: String,
creditCardNumber: String,
onNameEntered: (value: String) -> Unit,
onCreditCardNumberEntered: (value: String) -> Unit,
) {
var innerCount by remember { mutableStateOf(0) }
@Skyyo
Skyyo / perf_snippet_17.kt
Created October 2, 2022 16:11
perf_snippet_17
@Composable
private fun InputsWrapperOptimized(
provideName: () -> String,
provideCreditCardNumber: () -> String,
onNameEntered: (value: String) -> Unit,
onCreditCardNumberEntered: (value: String) -> Unit,
) {
var count by remember { mutableStateOf(0) }
NameTextFieldOptimized(provideName, onNameEntered)