[Compose Side Effect] 1. LaunchedEffect 를 이용한 suspend fun 실행

2021. 12. 6. 02:03· Android Jetpack Compose/Compose Side Effect
목차
  1. LaunchedEffect 살펴보기
  2. key값을 두개 이상 만들기
반응형

LaunchedEffect 살펴보기

LaunchedEffect는 Composable에서 컴포지션이 일어날 때 suspend fun을 실행해주는 Composable이다. 

@Composable
fun LaunchedEffect(
    key1: Any?,
    block: suspend CoroutineScope.() -> Unit
) {
    ..
}

리컴포지션은 Composable의 State가 바뀔 때마다 일어나므로, 만약 매번 리컴포지션이 일어날 때마다 이전 LaunchedEffect가 취소되고 다시 수행된다면 매우 비효율적일 것이다. 이를 해결하기 위해 LaunchedEffect는 key라 불리는 기준값을 두어 key가 바뀔 때만 LaunchedEffect의 suspend fun을 취소하고 재실행한다.

 

예를 들어 TextField에 입력되는 문자를 snackbar로 보이게 만드는 상황을 생각해보자. 만약 문자가 바뀐다면 이전의 snackbar은 취소되고 새로운 snackbar가 보이도록 해야 한다.

 

그림1. LaunchedEffect

 

이를 구현하기 위해서는 TextField의 Text가 바뀔 때마다 snackbar을 보이도록 하는 suspend fun이 취소되고 재수행되어야 한다.

 

이는 다음과 같이 구현할 수 있다. 

1. TextField의 Text값이 변화하는 값을 저장하는 text변수를 만들기

2. text변수를 LaunchedEffect의 key값으로 주어 text가 바뀔 때마다 LaunchedEffect가 재수행되게 하기.

3. LaunchedEffect의 suspend fun block에서 snackbar 만들기

@Composable
fun KotlinWorldScreen() {
    val scaffoldState = rememberScaffoldState()
    var text by rememberSaveable { mutableStateOf("") } // 1. text변수 

    LaunchedEffect(text) { // 2.text 변수를 LaunchedEffect의 key로 설정
        //3. 이 블록은 text가 바뀔 때마다 취소되고 재수행됨
        scaffoldState.snackbarHostState.showSnackbar(
            message = "Current Text is $text"
        )
    }

    Scaffold(
        scaffoldState = scaffoldState
    ) {
        Column(modifier = Modifier.padding(16.dp)) {
            OutlinedTextField(
                value = text,
                onValueChange = { text = it }
            )
        }
    }
}

이 세가지를 수행하면 text의 State가 변화할 때마다 LaunchedEffect의 block이 재수행되어 그림1과 같은 결과가 나온다.

 

key값을 두개 이상 만들기

위에서는 text라는 하나의 변수값이 LauchedEffect의 재실행헤 대한 Trigger가 되었다. 하지만, 만약 LaunchedEffect의 block을 두개 이상의 변수에 의해 재실행 해야 할 때는 어떻게 해야할까?바로 key 값을 하나 더 명시하면 된다.

fun LaunchedEffect(
    key1: Any?,
    key2: Any?,
    block: suspend CoroutineScope.() -> Unit
)

 

예를 들어 number라는 새로운 변수도 LaunchedEffect를 발생시키는 값이라면 단순히 text 뒤에 number을 명시해주는 것만으로 가능하다.

LaunchedEffect(text, number) {
    scaffoldState.snackbarHostState.showSnackbar(
        message = "Current Text is $text And Number is $number"
    )
}

 

LaunchedEffect는 vararg를 사용하여 Key값을 무제한으로 줄 수 있도록 만들고 있다. 따라서 Key값은 무제한으로 추가가 가능하다.

fun LaunchedEffect(
    vararg keys: Any?,
    block: suspend CoroutineScope.() -> Unit
)

 

반응형
저작자표시 비영리 변경금지
  1. LaunchedEffect 살펴보기
  2. key값을 두개 이상 만들기


 

Kotlin, Android, Spring 사용자 오픈 카톡

오셔서 궁금한 점을 질문해보세요!
비밀번호 : kotlin22

open.kakao.com

'Android Jetpack Compose/Compose Side Effect' 카테고리의 다른 글
  • [Compose Side Effect] Disposable Effect 란 무엇인가?
  • [Compose Side Effect] LaunchedEffect에서 한 번만 실행되어야 하는 동작 처리하기
  • [Compose Side Effect] rememberCoroutineScope을 이용해 Composable의 생명주기에 맞춰 코루틴 수행하기
  • [Compose Side Effect] Side Effect(부수효과) 란 무엇인가?
Dev.Cho
Dev.Cho
'조세영의 Kotlin World'는 Kotlin를 전문적으로 다루는 개인 기술 블로그입니다. Kotlin 세계에 대한 양질의 자료를 제공하며 Kotlin, Android, Spring, CI, CD 분야에 대해 다룹니다.
Dev.Cho
조세영의 Kotlin World
Dev.Cho
전체
오늘
어제

블로그 메뉴

  • LinkedIn
  • GitHub
  • 분류 전체보기 (491)
    • Kotlin (104)
      • Class and Interface (19)
      • Variable and Function (8)
      • Modifier (5)
      • Collection (14)
      • Time (8)
      • 동시성 제어 (7)
      • Reactive Programming (2)
      • Paradigm (2)
      • Kotlin 자료구조 (15)
      • Design Patterns (11)
      • Algorithm (3)
      • Exception (1)
      • 기타 (9)
      • Update History (0)
    • Coroutines (32)
      • Coroutine Basics (18)
      • Flow (9)
      • CoroutineScope (3)
      • Debugging (2)
    • Testing Codes (28)
      • Test 기본 (3)
      • JUnit5 (9)
      • MockK (6)
      • Testing Coroutines (1)
      • Testing Android (8)
      • Test 기타 (1)
    • Spring (50)
      • Dependency Injection (18)
      • Settings (5)
      • REST API (0)
      • DevTools (1)
      • MVC (18)
      • Error (2)
      • MongoDB (2)
      • Database (4)
    • Android (39)
      • Architecture (2)
      • Component (5)
      • Manifest (1)
      • Lifecycle (2)
      • Dependency Injection (17)
      • Resource (1)
      • Storage (1)
      • Security and Optimization (1)
      • WebView (2)
      • Error (6)
    • Android Jetpack Compose (33)
      • Compose (6)
      • Compose Modifier (13)
      • Compose Resource (4)
      • Compose State (4)
      • Compose Side Effect (6)
    • Android Jetpack Compose UI (48)
      • Compose Layout (14)
      • Compose Text (10)
      • Compose Button (5)
      • Compose Dialog (2)
      • Compose TextField (0)
      • Compose UIs (4)
      • Compose Animation (1)
      • Compose Canvas (12)
    • Android Jetpack (10)
      • Datastore (5)
      • ViewModel (4)
      • LiveData (1)
      • Paging (0)
    • KMP (5)
    • Programming (4)
    • Machine (9)
      • JVM (7)
      • Linux (2)
    • CI, CD (74)
      • Gradle (12)
      • Groovy Gradle (5)
      • Git (25)
      • Git Remote (5)
      • GitHub (5)
      • GitHub Actions (21)
    • Network (33)
      • GraphQL (12)
      • HTTP (11)
      • Basic (9)
    • 오픈소스 (3)
    • Database (3)
      • MongoDB (3)
    • IDE (6)
      • Android Studio (2)
      • Intellij (4)
    • Firebase (1)
    • Javascript (9)

공지사항

  • 코틀린 코루틴 완전 정복 강의 in 인프런 오픈
  • 코틀린 코루틴의 정석 책 출간
  • Kotlin Coroutines 공식 기술 문서 한국어 번⋯
  • GitHub에서 조세영의 Kotlin World를 Foll⋯
  • 문의&제안

인기 글

태그

  • github
  • gradle
  • compose
  • Android Compose
  • junit4
  • 유닛 테스팅
  • 스프링
  • Unit Testing
  • java
  • flow
  • kotlin spring
  • Spring
  • Coroutine
  • GraphQL
  • Class
  • HTTP
  • 안드로이드
  • Jetpack Compose
  • Android
  • 코루틴
  • Dependency Injection
  • 코틀린
  • GIT
  • github actions
  • Kotlin
  • junit
  • junit5
  • dagger2
  • 의존성 주입
  • Spring boot

최근 글

반응형
hELLO · Designed By 정상우.v4.3.0
Dev.Cho
[Compose Side Effect] 1. LaunchedEffect 를 이용한 suspend fun 실행
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.