Compose Side Effect

임찬형·2022년 2월 14일
0

Android Compose

목록 보기
5/16

Side Effect란?

  • 앱 상태 변경이 Composable 함수 외부에서 발생하는 것
  • Compose에서는 Side Effect가 없어야 함

Effect API

  • Composable 외부에서 앱 상태 변경을 하려는 경우 Effect API를 사용해 Side Effect가 예측 가능하도록 해야 함
  1. Launched Effect: 컴포저블 내에서 안전하게 정지 함수 실행
    - 특징
    Launched Effect가 컴포지션 실행하면 매개변수로 전달된 block 람다를 코루틴으로 실행
    Launched Effect의 key 매개변수가 바뀌면 기존 코루틴 취소 후 새로 실행 +) LaunchedEffect(true 또는 Unit)으로 1회 실행하는 코드 블록 생성 가능

state에 에러가 있는 경우, LaunchedEffect 코드가 실행되며, 에러가 없어지면 LaunchedEffect 코드가 삭제되어 코루틴이 취소됨.

  1. RememberCoroutineScope: 컴포지션 인식 범위 확보해 코루틴 실행
    - 특징
    LaunchedEffect와 다르게 Composable 외부에서 사용 가능
    컴포지션 종료한 후 자동으로 취소되도록 범위 지정된 코루틴 실행

    Button의 onClick함수는 람다로, Composable의 내부가 아님. 따라서 MovieScreen 컴포저블에 바인딩된 CoroutineScope를 생성하여 정지 함수인 showSnackbar를 실행함.

  2. RememberUpdatedState: 값이 변경되는 경우 다시 시작되지 않아야 하는 효과에서 값 참조

    • 특징
      LaunchedEffect는 key값이 변경되면 코드 블록이 재실행됨. rememberUpdatedState로 감싸놓은 값은 key값이 변경돼도 코드 블록이 재실행 되지 않음
      비용이 많이 드는 작업 or 재실행 금지된 오래 걸리는 작업 포함한 효과에 사용


(일정 시간이 지나면 사라지는 LandingScreen)
LandingScreen이 재구성되는 경우에 delay 및 onTimeout이 실행되면 안됨.
onTimeout은 LaunchedEffect에서 참조하지만 재실행 조건에서 제외함.
만약 onTimeout을 rememberUpdatedState로 감싸지 않으면 onTimeout이 변경되었을 경우에도 최초 onTimeout의 람다만 실행됨(최신값 갱신X)

  1. DisposableEffect: key가 변경되거나 컴포지션 종료 후 정리해야 하는 효과
    - 특징
    key가 변경되거나 컴포지션이 종료된 후 리소스 해제 등 작업에 사용
    LaunchedEffect와 비슷하나 컴포지션 종료 시 onDispose 꼭 호출

    LaunchedEffect와 효과가 비슷하지만 lifecycleOwner가 변경되었을 경우 등록한 observer를 제거해 주는 작업이 필요, 이를 onDispose에서 처리

  2. Side Effect: Compose 상태를 Compose가 아닌 객체와 공유

    • 특징
      컴포지션 완료 후 동작을 정의
      recomoposition 할 때마다 호출됨
  3. ProduceState: Compose 상태가 아닌 값을 Compose 상태로 만들어 반환

    • 특징
      Flow, LiveData, RxJava 등의 외부 observer 기반 상태를 Composition으로
  4. DerivedStateOf: 다른 상태 객체에서 특정 상태가 계산되거나 파생되는 경우 사용
    - 특징
    계산에서 사용되는 상태 중 하나가 변경될 때만 계산 시행

    derivedStateOf는 todoTask가 변경될 때마다 highPriorityKeywords 계산 후 UI 업데이트.

0개의 댓글