State를 붙잡기 위해 MutableState <T>를
반드시 써야 할 필요는 없습니다. 관찰 가능한 타입이면 State
는 지원합니다. 우선 지원 가능한 타입을 알아보기 전에 하나 확실하게 알아야 하는 사실이 있습니다. 반드시 지원 가능한 타입을 State <T>로
바꿔줘야 합니다. 그래야 컴포저블들이 자동으로 State
가 바뀔 때 recompose
할 수 있습니다.
컴포즈는 안드로이드 앱에서 사용되는 관찰가능한 타입에 State <T>를
생성할 수 있는 함수를 올려놨습니다.
Flow
의존성
dependencies{
implementation("androidx.lifecycle:lifecycle-runtime-compose:2.6.2")
}
collectAsStateWithLifecycle()
라이프 사이클에 따라 Flow로부터
값을 수집하고 앱이 리소스를 보존할 수 있도록 허용합니다.
컴포즈 State로부터
마지막으로 방출된 값을 대표합니다.
플로우 수집에 이 API를 추천합니다.
메모 : collectAsStateWithLifeCycle()에 대해 더 자세히 알고 싶다면 [미디엄 블로그]를 읽어보는 것 추천드립니다.
collectAsState
collectAsStateWithLifecycle()과
유사합니다. 왜냐면 Flow
에서 값을 가져온 후 State
로 변환하기 때문입니다.
만약 플랫폼에 구애받지 않아야 한다면 collectAsStateWithLifeCycle
대신 collectAsState
를 사용하면 됩니다. 기본 기능이므로 의존성은 필요 없습니다.
예제
Flow로 변경해 주는 함수를 사용하지 않을 경우
@Composable
fun FlowSample(){
var sampleText by remember { mutableStateOf("아직 안됬어") }
val a: Flow<String> = flow {
while(true) {
delay(1000L)
emit("이게 플로우여")
}
}
LaunchedEffect(key1 = sampleText) {
a.collect {
sampleText = it
}
}
Text(text = sampleText)
}
매번 CoroutineScope에서 변경해줘야 하는 불편함이 있습니다
함수를 이용하게 되면 간결하게 표현할 수 있습니다
@Composable
fun FlowSample(){
var sampleText by remember { mutableStateOf("아직 안됬어") }
val a: Flow<String> = flow {
while(true) {
delay(1000L)
emit("이게 플로우여")
}
}
sampleText = a.collectAsStateWithLifecycle(initialValue = "아직 들 됬어").value
// sampleText = a.collectAsState(initial = "아직 덜 됬어").value
Text(text = sampleText)
}
LiveData
observeAsState()
LiveData
를 관측시작해서 값을 State
로 값을 알려줍니다.
의존성
dependencies{
implementation("androidx.compose.runtime:runtime-livedata:1.6.1")
}
예제
val name = MutableLiveData<String>()
@Composable
fun LiveDataSample(){
val name1 by name.observeAsState()
Column (modifier = Modifier.padding(16.dp)) {
if(name1 != null)
Text(
text = "Hello! $name1",
modifier = Modifier.padding(bottom = 8.dp),
style = MaterialTheme.typography.bodyMedium
)
OutlinedTextField(
value = name1 ?: "",
onValueChange = { name.postValue(it)},
label = { Text("Name")}
)
}
}
Rx Java2, 3
subscribeAsState()는
RxJava2, 3의 반응형 스트림을 Compose State로
변환하는 확장함수입니다.
버전에 따라 의존성의 차이만 있을 뿐 함수의 기능은 동일합니다.
dependencies {
implementation("androidx.compose.runtime:runtime-rxjava3:1.6.1")
}
키 포인트
Comspoe는 State 객체를 읽어오는 과정에서 자동 recompose 됩니다. Compose에서 LiveData와 같은 관찰 가능한 다른 유형을 사용할 경우 이를 읽어오려면 반드시 State로 변환해야 합니다. Composable에서 LiveData <T>. observeAsState()와 같은 compsable 확장 함수를 사용하여 형 전환이 이루어지는지 확인해야 합니다.
참고 : 이러한 통합으로 국한되는 건 아닙니다. 사용자가 직접 작성한 관찰 가능한 클래스를 사용하는 경우 produceState API를 사용하여 State를 생성하도록 변환시키면 됩니다.
참고
상태 및 Jetpack Compose | Android Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. 상태 및 Jetpack Compose 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 앱의 상태는 시간이 지남에 따라
developer.android.com
'안드로이드(Compose) > 개념' 카테고리의 다른 글
remember 강제 재실행하는 방법 (0) | 2024.04.11 |
---|---|
Compose에서 State를 복원하는 방법 (0) | 2024.04.04 |
State Hoisting(상태 호이스팅) (0) | 2024.03.27 |
Stateful 과 Stateless (0) | 2024.03.25 |
State and Jetpack Compose (0) | 2024.03.18 |