SavedStateHandle์ Android ๊ฐ๋ฐ์์ ViewModel์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ๋๋ฐ ์ฌ์ฉ๋๋ ์ค์ํ ์ปดํฌ๋ํธ์ ๋๋ค. ์์คํ ์ ์ํ ํ๋ก์ธ์ค ์ข ๋ฃ๋ ์ค์ ๋ณ๊ฒฝ๊ณผ ๊ฐ์ ์ํฉ์์๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๋ณด์กดํ ์ ์๊ฒ ํด์ค๋๋ค.
๋จ, SavedStateHandle์ local์ด๋ remote ์ ์ฅ์์๋ ๋ค๋ฅธ ๊ฐ๋ ์ ๋๋ค.
SavedStateHandle์ ์๋๋ก์ด๋ ์์คํ ์ "saved instance state" ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ์ ์์๋ก ์ ์ฅ๋๋ ๋ฒ๋ค(Bundle) ํํ๋ก, ๋ค์๊ณผ ๊ฐ์ ํน์ง์ด ์์ต๋๋ค:
์ ์ฅ ์์น์ ์๋ช
์ ํฉํ ์ฌ์ฉ ์ฌ๋ก
๋ถ์ ํฉํ ์ฌ์ฉ ์ฌ๋ก
์๊ตฌ์ ์ธ ๋ฐ์ดํฐ ์ ์ฅ์ด ํ์ํ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค:
์๋ ์ํ ์ ์ฅ
๋ค์ํ ๋ฐ์ดํฐ ํ์ ์ง์
ViewModel์์์ ์ฌ์ฉ
kotlinCopyclass MyViewModel(
private val savedStateHandle: SavedStateHandle
) : ViewModel() {
var username: String
get() = savedStateHandle.get<String>(KEY_USERNAME) ?: ""
set(value) {
savedStateHandle[KEY_USERNAME] = value
}
companion object {
private const val KEY_USERNAME = "username"
}
}
Compose์์์ ์ฌ์ฉ ์์
kotlinCopy@Composable
fun UserScreen(
viewModel: MyViewModel = viewModel()
) {
var username by remember { mutableStateOf(viewModel.username) }
Column(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
) {
OutlinedTextField(
value = username,
onValueChange = {
username = it
viewModel.username = it
},
label = { Text("์ฌ์ฉ์ ์ด๋ฆ") }
)
}
}
StateFlow์ ํจ๊ป ์ฌ์ฉํ๊ธฐ
StateFlow๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ฑ ํจ์จ์ ์ธ ์ํ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค:
kotlinCopyclass MyViewModel(
private val savedStateHandle: SavedStateHandle
) : ViewModel() {
private val _username = savedStateHandle.getStateFlow("username", "")
val username = _username.asStateFlow()
fun updateUsername(newName: String) {
savedStateHandle["username"] = newName
}
}
Compose์์ StateFlow ํ์ฉ
kotlinCopy@Composable
fun UserProfileScreen(
viewModel: MyViewModel = viewModel()
) {
val username by viewModel.username.collectAsState()
Column {
Text("ํ์ฌ ์ฌ์ฉ์: $username")
OutlinedTextField(
value = username,
onValueChange = { viewModel.updateUsername(it) },
label = { Text("์ฌ์ฉ์ ์ด๋ฆ ๋ณ๊ฒฝ") }
)
}
}
ํค ๊ด๋ฆฌ
์ ์ฅ ์ฉ๋
Parcelable ๊ตฌํ
์ค์ ํ์ฉ ์ฌ๋ก
๋ณต์กํ ํผ ๋ฐ์ดํฐ ๊ด๋ฆฌ:
class FormViewModel(
private val savedStateHandle: SavedStateHandle
) : ViewModel() {
private val _formData = savedStateHandle.getStateFlow("form_data", FormData())
val formData = _formData.asStateFlow()
fun updateField(field: String, value: String) {
val currentData = _formData.value
val updatedData = when(field) {
"name" -> currentData.copy(name = value)
"email" -> currentData.copy(email = value)
else -> currentData
}
savedStateHandle["form_data"] = updatedData
}
@Parcelize
data class FormData(
val name: String = "",
val email: String = ""
) : Parcelable
}
SavedStateHandle์ Android ์ฑ์์ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ViewModel๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ค์ ๋ณ๊ฒฝ์ด๋ ํ๋ก์ธ์ค ์ข ๋ฃ ๊ฐ์ ์ํฉ์์๋ ์์ ์ ์ผ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.