Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 안드로이드
- MVVM
- Retrofit
- ADB
- RecyclerView
- 깃헙
- 웹뷰
- Kotlin
- 안스
- 안드로이드 스튜디오
- Github
- DAGGER
- 스튜디오
- studio
- DI
- 에러
- build
- 코루틴
- Android
- coroutine
- 코틀린
- compose
- Gradle
- 안드로이드스튜디오
- cursor
- hilt
- error
- 유튜브
- 의존성주입
- WebView
Archives
- Today
- Total
코딩하는 일용직 노동자
MVI 라이브러리 Orbit 본문

https://github.com/orbit-mvi/orbit-mvi
GitHub - orbit-mvi/orbit-mvi: A simple MVI framework for Kotlin Multiplatform and Android
A simple MVI framework for Kotlin Multiplatform and Android - orbit-mvi/orbit-mvi
github.com
MVI 패턴을 쉽고 안전하게 구현할 수 있도록 도와주는 라이브러리이다.
data class CalculatorState(
val total: Int = 0
)
sealed class CalculatorSideEffect {
data class Toast(val text: String) : CalculatorSideEffect()
}
class CalculatorViewModel: ContainerHost<CalculatorState, CalculatorSideEffect>, ViewModel() {
// Include `orbit-viewmodel` for the factory function
override val container = container<CalculatorState, CalculatorSideEffect>(CalculatorState())
fun add(number: Int) = intent {
postSideEffect(CalculatorSideEffect.Toast("Adding $number to ${state.total}!"))
reduce {
state.copy(total = state.total + number)
}
}
}
class CalculatorActivity: AppCompatActivity() {
// Example of injection using koin, your DI system might differ
private val viewModel by viewModel<CalculatorViewModel>()
override fun onCreate(savedState: Bundle?) {
...
addButton.setOnClickListener { viewModel.add(1234) }
viewModel.observe(state = ::render, sideEffect = ::handleSideEffect)
}
private fun render(state: CalculatorState) {
...
}
private fun handleSideEffect(sideEffect: CalculatorSideEffect) {
when (sideEffect) {
is CalculatorSideEffect.Toast -> toast(sideEffect.text)
}
}
}
@Composable
fun CalculatorScreen(viewModel: CalculatorViewModel) {
val state = viewModel.collectAsState().value
viewModel.collectSideEffect { handleSideEffect(it) }
// render UI using data from 'state'
...
}
private fun handleSideEffect(sideEffect: CalculatorSideEffect) {
when (sideEffect) {
is CalculatorSideEffect.Toast -> toast(sideEffect.text)
}
}
'안드로이드' 카테고리의 다른 글
| Hilt, 5분 만에 정복하기 (feat. 배달 서비스 비유) (0) | 2025.12.14 |
|---|---|
| 안드로이드 클린 아키텍처, 쉽게 이해하기. (0) | 2025.12.14 |
| Hilt에서 @Provides와 @Binds: 언제, 어떻게 사용해야 할까? (1) | 2025.08.10 |
| LaunchedEffect, DisposableEffect, LifecycleEventEffect, LifecycleStartEffect, LifecycleResumeEffect 정리 (2) | 2025.08.10 |
| Android 프로젝트에 ktlint + Spotless 적용하기 (2) | 2025.07.27 |