본 글은 개인적으로 Jetpack AndroidX Compose의 스터디한 내용을 정리하는 아카이브용입니다.
지극히 개인적인
의견입니다.
테스트 전제 조건
실험하는 소스 : https://github.com/Pluu/WebToon/compare/develop-compose
LiveData의 Return은 Nullable이다.
LiveData
@Composable
inline fun <T> LiveData<T>.observeAsState(): State<T?>
https://github.com/androidx/androidx/blob/androidx-master-dev/compose/runtime/runtime-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt
StateFlow
@Composable
inline fun <T> StateFlow<T>.collectAsState(
context: CoroutineContext = EmptyCoroutineContext
): State<T> = collectAsState(value, context)
https://github.com/androidx/androidx/blob/androidx-master-dev/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/FlowAdapter.kt
val list : List<T>? by viewModel.listEvent.observeAsState(null)
if (list != null) {
list.isEmpty() // <-- 컴파일 에러
}
이 경우 아래와 같이 컴파일 실패가 발생
Smart cast to ‘List
' is impossible, because 'list' is a property that has open or custom getter
Hint로는 List이지만 실제로는 Delegation + State<T?>라서, list에 접근할때 새로운 getValue 가 호출되므로 스마트 캐스팅이 안된다.
private class SnapshotMutableState<T>(
value: T,
val policy: SnapshotMutationPolicy<T>
) : StateObject, MutableState<T> {
@Suppress("UNCHECKED_CAST")
override var value: T
get() = next.readable(this).value
set(value) = next.withCurrent {
if (!policy.equivalent(it.value, value)) {
next.writable(this) { this.value = value }
}
}
}
https://github.com/androidx/androidx/blob/androidx-master-dev/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/MutableState.kt#L293
progress를 사용하는 경우, 자동 Indicator가 동작하지 않음
fun CircularProgressIndicator(
@FloatRange(from = 0.0, to = 1.0) progress: Float,
modifier: Modifier = Modifier,
color: Color = MaterialTheme.colors.primary,
strokeWidth: Dp = ProgressIndicatorConstants.DefaultStrokeWidth
)
fun CircularProgressIndicator(
modifier: Modifier = Modifier,
color: Color = MaterialTheme.colors.primary,
strokeWidth: Dp = ProgressIndicatorConstants.DefaultStrokeWidth
)
기존 앱에서 부분 마이그레이션을 할 경우 앱의 테마 정보를 Compso로 가져올 때 사용할 필요가 있다.
Scope 단위로 데이터 주입이 가능한 Ambient
느립니다.
comments powered by Disqus
Subscribe to this blog via RSS.
LazyColumn/Row에서 동일한 Key를 사용하면 크래시가 발생하는 이유
Posted on 30 Nov 2024