안드로이드

    [Retrofit 통신 실패]java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path $

    [Retrofit 통신 실패]java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path $

    원인 우리가 Response로 받을 거라 생각했던 타입과 실제 들어온 Response의 타입이 달랐을 때 발생하는 오류 해결 Response의 타입에 맞게 데이터 클래스를 선언해 주거나 오브젝트를 String으로 변환시켜 주는 ScalarsConverterFactory 라이브러리를 사용하거나 둘 중 하나를 택하면 된다. 2번을 선택할 경우 방법은 다음과 같다. 의존성 추가 implementation 'com.squareup.retrofit2:converter-scalars:2.9.0' retrofit 선언부에 추가 .addConverterFactory(ScalarsConverterFactory.create()) val rt = retrofit2 .Retrofit .Builder() .baseUrl(bas..

    Key 1 was already used. If you are using LazyColumn/Row please make sure you provide a unique key for each item.

    Key 1 was already used. If you are using LazyColumn/Row please make sure you provide a unique key for each item.

    원인 LazyColumn 또는 LazyRow를 쓸 때 각 항목에 고유한 위치값을 안 썼기 때문 LazyColumn에 item을 추가하는 기능을 만들었을 때 발생할 수 있다. 기본 레이아웃일 경우 자체적으로 처리되지만 커스텀일 경우 items의 key 패러미터에 고유한 key값을 넘겨줘야 한다. itemsIndexed( items = cl, key = { index: Int, item: CheckListInfo -> item.hashCode() } ) 나의 경우 key값으로 item의 해시 값을 넣어줬지만 내용이 같으면 해시값도 같으므로 위와 같은 에러가 발생했다. 해결 간단하다. 안겹치는 고유한 키 값을 주면 된다. itemsIndexed( items = cl, key = { index: Int, _: ..

    Expected a boolean but was BEGIN_OBJECT at line 1 column 85 path $[0].visibility

    Expected a boolean but was BEGIN_OBJECT at line 1 column 85 path $[0].visibility

    원인 엔티티에 들어가는 데이터 클래스 프로퍼티의 타입을 바꿈 해결 원래 들어가있던 데이터와 바뀐 프로퍼티의 타입이 충돌을 일으키는 것 이므로 앱 데이터 삭제 후 재 시작

    Unable to create instance of interface androidx.compose.runtime.MutableState. Registering an InstanceCreator or a TypeAdapter for this type, or adding a no-args constructor may fix this problem.

    Unable to create instance of interface androidx.compose.runtime.MutableState. Registering an InstanceCreator or a TypeAdapter for this type, or adding a no-args constructor may fix this problem.

    원인 Gson이 Json객체를 MutableState 인터페이스로 역직렬화 할 수 없어서 발생하는 문제 Gson은 인터페이스를 직접 인스턴스화 하지 못하므로 해당 인터페이스를 직접 처리할 수 있는 커스텀 인스턴스 생성자(InstanceCreator), 커스텀 타입 어댑터(Type Adapter)를 등록해야함 해결 entity에 들어가는 DataClass의 프로퍼티 중 MutableState를 쓰던게 있었음 data class CheckListInfo( //할 일 var checklistContent: String, //초기화 요일 var restartWeek: Set, //수행여부 var done: Boolean = false, //애니메이션 visivle var visibility: MutableSta..

    Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number.

    Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number.

    원인 Room에서 스키마 바꾸고 바로 실행하면 볼 수 있는 오류. 무결성 침해됬다고 나오는 오류다. 해결 방법은 2가지다. 배포 전 휴대폰 설정 -> 애플리케이션 -> "본인이 만든앱" -> 저장공간 -> 데이터 삭제 로 직접 로컬 DB를 날려버리면 된다.(권장) 배포 후 만일 배포된 어플이라면 데이터베이스 마이그레이션을 통해 데이터베이스 버전을 높일 수 있다.

    Cannot figure out how to save this field into database. You can consider adding a type converter for it.

    Cannot figure out how to save this field into database. You can consider adding a type converter for it.

    원인 Room이 필드 타입을 인식하지 못해서 발생하는 문제, 보통 코틀린의 Basic Type이 아닌 직접 만든 데이터 클래스 리스트를 사용할 때 발생 Entity 클래스 @Entity(tableName = "checklist") data class CheckListEntity( @ColumnInfo(name = "checklist_info") var checkLists: List ){ @PrimaryKey(autoGenerate = true) var idx: Long = 0 } 데이터 클래스 data class CheckListInfo( //할 일 var checklistContent: String, //초기화 요일 var restartWeek: Set, //수행여부 var done: Boolean =..

    Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and kotlin-stdlib-jdk8-1.7.20 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20)

    Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and kotlin-stdlib-jdk8-1.7.20 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20)

    원인 의존성 문제이거나 코틀린 버전 문제 중 하나 해결 프로젝트 build.gradle의 코틀린 버전을 변경 id 'org.jetbrains.kotlin.android' version '1.7.20' apply false 아래로 변경 id 'org.jetbrains.kotlin.android' version '1.8.10' apply false 버전에 맞춰서 코틀린 컴파일러도 변경 아래 사이트 참고 https://developer.android.com/jetpack/androidx/releases/compose-kotlin

    Navigation의 백스택을 관리해보자

    Navigation의 백스택을 관리해보자

    바텀 내비게이션과 내비게이션 컨트롤러를 이용한 프래그먼트의 이동을 구현하다 보면 꼬일 때가 있습니다. 위 상황처럼 홈에서 원 프래그먼트로 바로 이동하게 하면 다시 홈으로 갈 수 없는 것을 볼 수 있습니다. 왜 이런 상황이 발생하는지, 해결 방법이 무엇인지 알아봅시다. 내비게이션 백 스택의 구조 일반적인 내비게이션의 백스택입니다. 프래그먼트를 이동할 때마다 이전 프래그먼트가 백스택에 쌓이는 형식입니다. 그렇다면 바텀 내비게이션의 목적지는 어떨까요? 처음 바텀 내비게이션을 정의하면 목적지가 저장됩니다. 위에 보인 예제처럼 홈에서 임의로 액션을 정의하면 바텀 내비게이션의 목적지에 정의한 액션이 들어가게 됩니다. 따라서 위 gif처럼 바텀 내비게이션으로 홈 화면으로 돌아갈 수 없는 것입니다. 일반 내비게이션 백..