Android & Kotlin
-
Kotlin Flow 연산자 distinctUntilChanged 분석Android & Kotlin 2025. 9. 4. 11:02
기본개념Kotlin Flow의 연산자로 연속된 중복값을 필터링하여 새로운 Flow를 생성하여 반환함이전 값과 현재 값이 같을 때(중복일 때) 현재 값을 방출하지 않고 필터링함필터 조건이 True일 때는 아래로 값을 내려주지 않음 (중복으로 판단)값이 변경될 때만 다운스트림으로 값을 전달함 내부 진행 과정 1. 외부 호출 (사용자 코드)viewModel.uiState.map { it.currentTab?.isScrollable == true } .distinctUntilChanged() .onEach { appBarBehavior?.setScrollable(it) } .launchInByRepeatOnStarted(this) 2. distinctUntilChanged 함수 : flow -..
-
AndroidStudio/IntelliJ IDE 에서 변수 추적이 안되는 케이스 분석Android & Kotlin 2025. 8. 8. 13:58
0. 개요IntelliJ IDE 에서 자동 변수추적(find usage) 이 작동하지 않는 케이스를 분석하고 해결방안을 정리합니다.해당 글은 Kotlin 기반 프로젝트 이슈를 다룹니다.1. 데이터 클래스 변수의 사용처 추적 이슈1-1. 문제 상황데이터 클래스의 변수를 IDE에서 추적하여 사용처를 확인하려 했으나, 실제로는 사용되고 있음에도 사용처가 표시되지 않는 문제 발생1-2. 원인 분석함수 파라미터의 자동 할당(named parameter)을 사용할 경우, IDE가 변수 할당 위치를 제대로 인식하지 못함인식 가능한 경우: 명시적으로 파라미터명을 표기한 경우MainActivity.start(this, MainParams(url, someParam = isSomeParam)) 인식 불가능한 경우: 자동 ..
-
Serialization 라이브러리 마이그레이션 과정(Gson -> Kotlinx-Serialization)Android & Kotlin 2023. 12. 23. 11:42
개요위 글에서는 Gson 에서 Kotlinx-Serialization 으로 의 마이그에션 도중 겪은 문제 및 그 과정에서 얻게된 정보들을 정리합니다.마이그레이션 배경에 대해서는 이전 글을 참고해주세요 📌 마이그레이션 순서라이브러리 선언 (각 모듈 별로 선언해야함)모델 변경 (어노테이션 수정), Adapter (Serializer) 정의retrofit converter 정의 및 추가통신 이외 부분에서도 Gson 걷어내기 (optional)(크게는 위 순서대로 진행했지만 마이그레이션을 실제로 진행하다보면 부분부분이 물려있어 왔다갔다하며 수정이 필요하다.) 1. 라이브러리 선언- serialization 라이브러리 선언- retrofit converter 추가 (왓슨형 감사합니다 ㅜㅜ)- 모듈화가 되어 ..
-
직렬화 라이브러리 마이그레이션 이유(Gson 에서 Kotlinx-Serialization)Android & Kotlin 2023. 12. 22. 00:12
📌 마이그레이션 배경 Gson 은 Kotlin 의 Null-Safety 를 완전히 지원하지 못한다 Backend 로 부터 약속에서 어긋난 응답을 받는 경우가 존재한다(None-Null type 필드가 Null로) Backend 와 약속된 응답 형태에 근거하여 응답값의 Nullable 을 판단해왔었지만, 간혹 약속되지 않은 Null 을 전달해줄 때가 있었다. 이때Gson 은 None-Null 로 정의 된 필드에 대해서 Null 값이 들어 올 경우 해당 객체에 Null을 주입한다. 그리고 이 필드가 사용되는 시점(정확한 시점으로 규정할 수 없음)에 에러를 발생시킨다. 시점을 규정할 수 없는 탓에 예외처리도 당연히 불가하며 이는 곧 앱 크래시로 이어질 수 있는 위함한 결과를 초래할 수 있다. [ 마이그레인션 ..
-
Hilt 관련 리펙토링 기록 (@binds @Provides 차이 , UsecaseModule)Android & Kotlin 2023. 1. 8. 15:39
구조설명 (클린 아키텍처) 1. 클린아키텍처 구조에서 Hilt 를 통해 의존성 주입을 사용하고 있었다. 2. 이때 Repository (Interface) 의 주입을 위해 RepoisotyModule 을 만들어 사용했고 @Provides 를 사용해왔었다. 3. 그리고 Usecase 에서 Ropository 와 ErrorHandler 에 의존했고 이에 따라 각각 UsecaseModule, NetowrkModule 을 정의해주어 사용했다. class GetSomeUseCase( private val repository: Repository, private val errorHandler: ErrorHandler ) : BaseUseCase() {...} @ErrorHandler @Provides @Single..
-
DialogFragment 오류 정리 (Radius , 크기 지정)Android & Kotlin 2022. 11. 28. 17:53
Dialog Framgnet 모서리 둥글게 (radius 설정) 문제상황 cardView 로서 radius 를 주던 drawable 에서 배경을 정의해서 적용하던 적용이 되지 않음 해결 방법 아래와 같이 정의 된 style 을 적용 or 코드로서 windowBackground, windowNoTitle 부분을 설정 //style.xml class Popup : DialogFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setStyle(STYLE_NO_TITLE, R.style.popupStyle) } ... } Dialog Fragment 크기 조절 하기 문제상황 dialo..
-
By 키워드를 이용한 Shared PreferenceAndroid & Kotlin 2022. 11. 18. 18:44
1. SharedPreferences 기본 사용법 val sharedPref = getSharedPreferences("name", Context.MODE_PRIVATE) with (sharedPref.edit()) { putString("key", "value") apply } 2. By 키워드를 통한 SharedPreferences 사용법 장점 값에 대한 접근, 수정이 매우 편함 (변수처럼 취급할 수 있음) 매번 getter, setter 를 구현해줄 필요가 없음 SharedPreference 를 객체를 생성하거나 가져오지 않아도 됨 구현 방법 1. ReadWriteProperty 를 구현한 Preference class 를 정의한다 //PreferenceProperty.kt class StringP..
-
Android 13 알아보기 (Target SDK 33 으로 변경)Android & Kotlin 2022. 11. 11. 19:02
목적 target sdk 를 33으로 올림에 있어 꼭 알아야할 부분에 대해 정리해보자 개발 환경 구성 안드로이드 스튜디오 업데이트 SDK 설치 Tools > SDK Manager > SDK Platforms → Android API 33 다운로드 Tools > SDK Manager > SDK Tools → Android SDK Build-Tools 33 다운로드 Android 13 Emulator 세팅 알림 런타임 권한 Android 13 미만 앱 설치시 Notification 을 띄울 수 있었음 Notification 권한을 갖는 것이 기본 Android 13 이후 runtime permission 을 받아야만 notification 을 띄울 수 있음 Notification 권한이 없는 것이 기본 PO..