IT/Android

๐Ÿ› ๏ธ Jetpack Compose: ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•ด์ค€ 5๊ฐ€์ง€ ํŒ

์™•๊ท€ 2025. 5. 24. 18:01
728x90
๋ฐ˜์‘ํ˜•

 

๐Ÿ› ๏ธ Jetpack Compose: ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•ด์ค€ 5๊ฐ€์ง€ ํŒ

Jetpack Compose๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์‹œ๊ฐ„์„ ์•„๋ผ๊ฒŒ ํ•ด์ค€ ๋ช‡ ๊ฐ€์ง€ ์œ ์šฉํ•œ ํŒ๋“ค์„ ์ •๋ฆฌํ•ด๋ดค์Šต๋‹ˆ๋‹ค. UI ํšจ์œจ์„ ๋†’์ด๊ณ  ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ํŒ๋“ค์ด๋‹ˆ ์ฐธ๊ณ ํ•ด๋ณด์„ธ์š”.


1. ์Šคํฌ๋กค ์œ„์น˜์— ๋”ฐ๋ผ TopAppBar ์ œ๋ชฉ ๋™์ ์œผ๋กœ ํ‘œ์‹œํ•˜๊ธฐ

์‚ฌ์šฉ์ž๊ฐ€ ์ฝ˜ํ…์ธ ๋ฅผ ์Šคํฌ๋กคํ•  ๋•Œ ํŠน์ • ์œ„์น˜๋ฅผ ์ง€๋‚˜๋ฉด TopAppBar์— ์ œ๋ชฉ์„ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. LazyListState์™€ derivedStateOf๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

val lazyListState = rememberLazyListState()

val showTitle by remember {
    derivedStateOf { lazyListState.firstVisibleItemIndex > 0 }
}

showTitle์„ TopAppBar์˜ ์ œ๋ชฉ ํ‘œ์‹œ ์—ฌ๋ถ€์— ํ™œ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


2. Modifier.composed๋กœ ์ปค์Šคํ…€ Modifier ๋งŒ๋“ค๊ธฐ

๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” Modifier ์กฐํ•ฉ์ด ์žˆ๋‹ค๋ฉด, Modifier.composed๋ฅผ ์‚ฌ์šฉํ•ด ์ปค์Šคํ…€ Modifier๋กœ ์ •์˜ํ•ด๋ณด์„ธ์š”. ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง‘๋‹ˆ๋‹ค.

fun Modifier.shimmerEffect(): Modifier = composed {
    // shimmer ํšจ๊ณผ ๊ตฌํ˜„
}

์ด์ œ modifier = Modifier.shimmerEffect()์ฒ˜๋Ÿผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


3. LaunchedEffect๋กœ ์ปดํฌ์ €๋ธ” ์ƒ๋ช…์ฃผ๊ธฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ

์ปดํฌ์ €๋ธ”์ด ์ฒ˜์Œ ๊ตฌ์„ฑ๋  ๋•Œ ๋‹จ ํ•œ ๋ฒˆ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ž‘์—…์€ LaunchedEffect๋ฅผ ์ด์šฉํ•ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

LaunchedEffect(Unit) {
    // ์ดˆ๊ธฐํ™” ์ž‘์—…
}

ํŠน์ • ํ‚ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋™์ž‘์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.


4. ์ตœ์‹  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” rememberUpdatedState

์ฝœ๋ฐฑ ํ•จ์ˆ˜๋‚˜ ์™ธ๋ถ€ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ recomposition ์—†์ด ์ตœ์‹  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ ค๋ฉด rememberUpdatedState๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

val currentOnClick by rememberUpdatedState(newOnClick)

DisposableEffect(Unit) {
    // currentOnClick์„ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉ
    onDispose { }
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ตœ์‹  ์ฝœ๋ฐฑ์ด๋‚˜ ๊ฐ’์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


5. ์ƒํƒœ ๋ณ€ํ™”๋ฅผ Flow๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” snapshotFlow

Compose์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ Flow๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด snapshotFlow๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

val scrollState = rememberScrollState()

LaunchedEffect(scrollState) {
    snapshotFlow { scrollState.value }
        .collect { value ->
            // ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ๋กœ์ง ์ฒ˜๋ฆฌ
        }
}

๋น„๋™๊ธฐ ๋กœ์ง์ด๋‚˜ debounce ์ฒ˜๋ฆฌ์—๋„ ์‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ ๋งˆ๋ฌด๋ฆฌ

์ด๋Ÿฌํ•œ ํŒ๋“ค์€ Jetpack Compose๋ฅผ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์ข€ ๋” ๋˜‘๋˜‘ํ•˜๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค. ๊พธ์ค€ํžˆ ํŒจํ„ดํ™”ํ•˜๊ณ  ์ปค์Šคํ…€ ์ปดํฌ์ €๋ธ”์„ ์ž‘์„ฑํ•ด๋‘๋ฉด ์žฅ๊ธฐ์ ์œผ๋กœ ์œ ์ง€๋ณด์ˆ˜์— ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

 

728x90
๋ฐ˜์‘ํ˜•