Android/Android Compose 16

Compound Component 방식을 사용하여 복잡한 Compose 대응하기

Compose로 화면을 만들기 시작하면 처음엔 깔끔한데, 어느 순간부터 이게 슬슬 이상해진다.Scaffold 안에상단 툴바 들어가고탭 들어가고상태바 패딩도 넣어야 하고플로팅 버튼에, 스낵바에, 로딩 레이어에…"아 이거 한 파일에 계속 써도 되나…?" 싶어지면 보통여러개의 컴포저블로 나눠서 그려보려고 한다. 그러다보면 재활용도 하고 싶고쉽게 시도해보는게 Slot API 인데 이게 또 복잡하면 문제가 발생한다. Compose 화면이 망가지는 과정보통 화면이 이렇게 커진다.처음엔 ScreenA() 같은 함수 하나에서 시작거기에 TopBar, TabRow, 리스트, 다이얼로그, 로딩, 에러 뷰 등등이 한데 모이기 시작어느 순간 @Composable fun ScreenA() 하나가 300줄이 넘어감이제서야 아 좀..

안드로이드 컴포즈 네비게이션 startDestination 에 argument 전달하기

이 글은 컴포즈 네비게이션 2.7 버전을 기준으로 작성됐다. 네비게이션을 쓰다가 startDestination 로 시작하는 화면에서 바로 argument 를 전달하고 싶을수도 있다.처음 시작하는 화면에서 쓰이고 있는 hiltViewModel 에서 SavedStateHandle  에 argument 로 던진 데이터를viewModel 이 시작될때부터 가지고 있어야하는 상황이라던가 그럴때 말이다. 그런데 argument 를  startDestination 경로에 넣으면 SavedStateHandle 에서 값을 가져오질 못한다.정확하게 찾진 못했는데 startDestination 는 정적인 경로만 등록이 가능하다는거 같다. 이때 arguments 를 등록하는 곳에 defaultValue 를 전달하고자 하는 값을..

Compose + AGSL 셰이더를 이용해서 간지나는 카드 애니메이션 만들기

어디선가 카드를 휘리릭 돌리면 카드가 돌아가면서 번쩍거리는 멋진 인터렉션을 본 적이 있는거 같다.셰이더나 애니메이션에 관심이 많아진 요즘 뭐라도 해보고 싶어서 뚝딱 해봤다. 일단 최종결과물부터 봐보자.꽤 멋져.  자자 액티비티부터 만들어준다.class MainActivity : ComponentActivity() {    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        enableEdgeToEdge()        setContent {            MetalCardFilpTheme {                Scaffold(modifier = Modifier...

안드로이드 compose 비트맵으로 캡쳐하기

를 만들려고 하루종일 삽질을 했다...결국 만드는건 포기했는데관련해서 괜찮은 라이브러리를 찾아서 소개한다.https://github.com/PatilShreyas/Capturable GitHub - PatilShreyas/Capturable: 🚀Jetpack Compose utility library for capturing Composable content and transforming it into🚀Jetpack Compose utility library for capturing Composable content and transforming it into Bitmap Image🖼️ - PatilShreyas/Capturablegithub.com어떻게 만들었다 들여다봐야지 ㅠㅠ..

Android Compose 의 @Immutable 와 @Stable

Jetpack Compose에서 @Immutable와 @Stable 어노테이션은 컴포저블 함수의 리컴포지션을 최적화하는 데 중요한 역할을 합니다. 각각의 어노테이션은 특정한 상황에서 사용되며, 사용하는 것과 사용하지 않는 것에 따라 성능에 미치는 영향이 달라집니다.1. @Immutable@Immutable 어노테이션은 클래스가 불변(immutable)임을 명시합니다. 불변 객체는 상태가 변경되지 않기 때문에, Jetpack Compose는 해당 객체가 변경되지 않는다고 가정하고 리컴포지션을 피할 수 있습니다.언제 사용할까?@Immutable은 객체가 불변이며, 내부의 모든 필드도 불변 객체일 때 사용합니다. 이는 데이터 클래스와 같은 경우에 자주 사용됩니다.예시:@Immutable data class U..

컴포즈의 Side-Effect 형제들에 대해서 알아보자 - 2

2024.04.21 - [Android/Android Compose] - 컴포즈의 Side-Effect 형제들에 대해서 알아보자 - 1 컴포즈의 Side-Effect 형제들에 대해서 알아보자 - 1컴포즈에는 side effect 라는 개념이 존재한다. 단어의 원래 뜻은 부작용이라는 뜻인데 왜 이런 명칭을 붙였는지 의아하긴 했는데 찾아보니 composable 은 단방향으로 state 를 전달하는게 기본인데 전choi-dev.tistory.com이전 글에 이어서 알아보자. 이번에는 DisposableEffect SideEffect 이렇게 알아볼 예정이다. DisposableEffect  는 앞글에서 봤던 LaunchedEffect 와 비슷하지만 취소됐을때 onDispose 가 호출된다.취소될때의 동작을 추가..

컴포즈의 Side-Effect 형제들에 대해서 알아보자 - 1

컴포즈에는 side effect 라는 개념이 존재한다. 단어의 원래 뜻은 부작용이라는 뜻인데 왜 이런 명칭을 붙였는지 의아하긴 했는데 찾아보니 composable 은 단방향으로 state 를 전달하는게 기본인데 전달되는 방향 반대로 상태를 변경해야하는 상황도 지원하기 위해 side effect 라는 개념을 도입했기 때문에 이런 이름이 붙었다고 한다. 요약을 해보자면 side effect 는 Composable 에서 자신이 아닌 외부의 상태에 영향을 발생시키는 것이겠다. 보통 flow 를 사용해서 특정 이벤트를 collect 하면 외부의 상태를 변경하는 경우가 일반적인 예라고 할 수 있겠다. Side Effect 를 지원하기 위한 다양한 API LaunchedEffect rememberCoroutineSc..

Jetpack Compose CompositionLocal 에 대해 알아봅시다

컴포즈를 사용하다보면 종종 CompositionLocal 을 마주치곤 한다. 테마를 커스텀하고 싶을때 사용하곤 했는데 CompositionLocal 은 어떻게 동작하길래 테마 커스텀에서 사용됐는지 개념을 알아보자. CompositionLocal 이 필요한 이유 컴포저블 함수들은 트리형태로 구성된다. 그래서 상태의 관리를 편하게 하기 위해서 보통 상태 호이스팅이라는 개념으로 상위 노드에서 관리하고 하위 노드로 전파한다. 그런데 극단적으로 트리의 깊이가 100개면 어떨까. 이 상태를 아래까지 다 전파하는건 쉽지 않을거다. 이때 CompositionLocal을 유용하게 써먹을 수 있는데 너무 대충 그렸지만 아래 같은 느낌으로 컴포지션로컬의 영역에 있는 컴포저블끼리는 하위에서 상위 노드의 상태에 접근하도록 제공..

스와이프 삭제 구현

이미 쓴 글이 있지만 솔직히 너무 별로라서 새로 만들어봤다. (솔직히 내가 만들어놓고도 이건 좀.. 하고 있었음) 2024.01.14 - [Android/Android Compose] - [안드로이드 컴포즈] 스와이프 삭제 구현 핵심 키워드는 DraggableAnchors, AnchoredDraggableState 이고 구현에 관심이 있다면 위 검색어로 찾아보면 훨씬 쉽고 자연스럽게 뚝딱하고 만들 수 있다. @OptIn(ExperimentalFoundationApi::class) @Composable fun SwipeScreen( contentComposable: @Composable () -> Unit, buttonComposable: @Composable () -> Unit, buttonModifie..

[안드로이드 컴포즈] 스와이프 삭제 구현

안드로이드 컴포즈에는 SwipeToDismiss 라는게 이미 만들어져 있다. 레이아웃을 옆으로 밀면 밀어낸 반대 방향에 버튼이 생기는 레이아웃 같은걸 만들때 쓴다. 하지만? 나는 또 다른 디자인으로 만들고 싶었다. 찾아보면 이걸 사용해서도 방법은 있겠지만 그냥 내가 생각나는대로 만드는게 빠를거 같아서 만들어봤다. 혹시나 구글이 준비해준 SwipeToDismiss 가 맘에 안드는 사람들에게 귀찮음을 덜어줄 수 있었으면 한다. 만드려는 레이아웃은 이렇다. 순서는 아래와 같다. 1. 스와이프 했음을 인지하는 방법 2. 스와이프한 값을 이용해서 컴포넌트를 스와이프 한 방향으로 옮기는 방법 3. 삭제 버튼을 나오게 하는 방법 @OptIn(ExperimentalMaterial3Api::class) @Composab..