SavePhoto_화면에서_Configuration_Change시_상태가_사라지는_문제 - boostcampwm-2024/and04-Nature-Album GitHub Wiki
💥 remember로 상태관리시 화면 회전에서 상태가 유지되지 않음
문제 정의
- 사진 저장 화면에서 화면 회전 등 Configuration Change가 발생할때 이미지, 라벨의 상태가 유지되지 않음
문제 해결 방법
- remember → rememberSaveable
- Label클래스를 Parcelable로 수정
문제 해결 진행
https://developer.android.com/develop/ui/compose/state#restore-ui-state
Configuration Change에서 발생하는 recomposition에서 remember로 관리하던 상태가 초기화 되는 문제!
→rememberSaveable로 화면 회전과 같은 상황에서 상태를 복원할 수 있도록 수정
others
- viewModel로 상태 관리?
- 기존 코드에서 뷰모델을 사용하지 않았는데 해당 컴포저블 내에서의 상태 관리를 위해 추가로 뷰모델을 만들 필요가 있나 하는 의문이 들어 일단은 생성하지 않음
- 이후 리팩토링시에 uri(or file)과 함께 관리하고 이벤트를 함수로 전달하는 방법 고려
Label을 rememberSaeable로 관리시 에러와 함께 앱이 종료되는 문제
→ Bundle로 저장할 수 없는 타입이라 발생한 문제
Parcelable 사용 : 현재 Label 클래스 자체가 room의 entity로 안드로이드 종속성을 가지고 있어 saver를 사용할 필요가 없다고 생각.
이후 모듈 분리시 해당 부분이 문제가 될 경우 Saver 사용이나 뷰모델 사용을 고려
결과
// 기존
@Entity(tableName = "label")
data class Label(
@PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id") val id: Int = 0,
@ColumnInfo(name = "background_color") val backgroundColor: String,
@ColumnInfo(name = "name") val name: String
)
// 수정후
@Parcelize
@Entity(tableName = "label")
data class Label(
@PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id") val id: Int = 0,
@ColumnInfo(name = "background_color") val backgroundColor: String,
@ColumnInfo(name = "name") val name: String
): Parcelable
// 기존
var imageUri: Uri = remember { Uri.EMPTY }
var selectedLabel: Label? = remember { null }
// 수정 후
var imageUri: Uri by rememberSaveable { mutableStateOf(Uri.EMPTY) }
var selectedLabel: Label? by rememberSaveable { mutableStateOf(null) }