[REFACTOR] BaseViewModel 걷어내고 Orbit MVI 자체 기능 사용하기#232
Conversation
|
""" Walkthrough이 변경사항은 프로젝트 전반에 걸쳐 Changes
Sequence Diagram(s)sequenceDiagram
participant UI
participant ViewModel
participant OrbitContainer
UI->>ViewModel: processAction(action)
ViewModel->>OrbitContainer: intent { ... }
OrbitContainer->>ViewModel: state (via reduce)
ViewModel->>OrbitContainer: postSideEffect(effect)
OrbitContainer-->>UI: sideEffect emitted
Assessment against linked issues
Suggested labels
Suggested reviewers
📜 Recent review detailsConfiguration used: .coderabbit.yaml 📒 Files selected for processing (7)
✅ Files skipped from review due to trivial changes (1)
🚧 Files skipped from review as they are similar to previous changes (4)
🔇 Additional comments (8)
✨ Finishing Touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
Documentation and Community
|
There was a problem hiding this comment.
Actionable comments posted: 5
🔭 Outside diff range comments (1)
feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt (1)
236-255: suspend 함수를 intent 블록 내에서 올바르게 호출
checkAndCreateAlarm은 suspend 함수이지만 intent로 래핑되지 않았습니다.saveAlarm의 intent 블록에서 호출될 때 컴파일 오류가 발생합니다.함수 시그니처를 수정하거나 호출 부분을 수정하세요:
옵션 1: 함수를 일반 함수로 변경 (권장)
-private suspend fun checkAndCreateAlarm(newAlarm: Alarm) { +private fun checkAndCreateAlarm(newAlarm: Alarm) = intent {옵션 2: 호출 시 intent 제거
private fun saveAlarm() = intent { val newAlarm = state.toAlarm() when (state.mode) { AlarmAddEditContract.EditMode.EDIT -> updateExistingAlarm(newAlarm) - AlarmAddEditContract.EditMode.ADD -> checkAndCreateAlarm(newAlarm) + AlarmAddEditContract.EditMode.ADD -> { + // intent 블록을 벗어나서 suspend 함수 호출 + container.orbit.runBlockingIntent { + checkAndCreateAlarm(newAlarm) + } + } } }
🧹 Nitpick comments (4)
feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt (1)
41-66: 함수명 일관성 개선 제안Side effect 처리 로직이 잘 구조화되었습니다. 다른 파일들과의 일관성을 위해 함수명을
handleSideEffect(단수)로 통일하는 것을 고려해보세요.-private fun handleSideEffects( +private fun handleSideEffect( sideEffect: SplashContract.SideEffect, navigator: OrbitNavigator, ) {feature/splash/src/main/java/com/yapp/splash/SplashViewModel.kt (1)
37-51:first사용이 스플래시 로직에 적합합니다!
collect대신first를 사용하여 첫 번째 값만 처리하는 것이 스플래시 화면의 일회성 체크에 더 적합합니다. 다만,first블록의 마지막에true를 반환하는 대신 조건 없이first()를 사용하는 것이 더 명확할 수 있습니다.- }.first { (userId, onboardingCompleted) -> + }.first().let { (userId, onboardingCompleted) -> if (userId != null && onboardingCompleted) { postSideEffect(SplashContract.SideEffect.NavigateToHome) } else { postSideEffect(SplashContract.SideEffect.NavigateToOnboarding) } - true }feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt (2)
43-48: Container 초기화 패턴 개선 고려container 초기화 시 즉시 intent를 실행하는 것은 동작하지만, 초기화 로직을 분리하는 것이 더 명확할 수 있습니다.
-override val container: Container<AlarmAddEditContract.State, AlarmAddEditContract.SideEffect> = container(initialState = AlarmAddEditContract.State()) { - intent { - reduce { state.copy(mode = if (alarmId == -1L) AlarmAddEditContract.EditMode.ADD else AlarmAddEditContract.EditMode.EDIT) } - initializeAlarmScreen() - } -} +override val container: Container<AlarmAddEditContract.State, AlarmAddEditContract.SideEffect> = container( + initialState = AlarmAddEditContract.State( + mode = if (alarmId == -1L) AlarmAddEditContract.EditMode.ADD else AlarmAddEditContract.EditMode.EDIT + ) +) + +init { + intent { + initializeAlarmScreen() + } +}
423-431: 중첩된 intent 사용 개선
postSideEffect의 콜백 내에서 새로운intent를 생성하는 것보다 별도의 액션을 통해 처리하는 것이 더 명확합니다.액션을 추가하여 처리하세요:
+// AlarmAddEditContract.Action에 추가 +object UndoHolidaySkip : Action그리고 다음과 같이 수정하세요:
onAction = { - intent { - reduce { - state.copy( - holidayState = state.holidayState.copy( - isDisableHolidayChecked = false, - ), - ) - } - } + processAction(AlarmAddEditContract.Action.UndoHolidaySkip) }processAction에 케이스 추가:
is AlarmAddEditContract.Action.UndoHolidaySkip -> undoHolidaySkip()새 함수 추가:
private fun undoHolidaySkip() = intent { reduce { state.copy( holidayState = state.holidayState.copy( isDisableHolidayChecked = false, ), ) } }
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (25)
core/ui/src/main/java/com/yapp/ui/base/BaseViewModel.kt(0 hunks)feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionNavGraph.kt(1 hunks)feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt(3 hunks)feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionViewModel.kt(2 hunks)feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt(0 hunks)feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerViewModel.kt(2 hunks)feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt(1 hunks)feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt(2 hunks)feature/fortune/src/main/java/com/yapp/fortune/FortuneViewModel.kt(4 hunks)feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt(3 hunks)feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt(14 hunks)feature/home/src/main/java/com/yapp/home/HomeScreen.kt(2 hunks)feature/home/src/main/java/com/yapp/home/HomeViewModel.kt(8 hunks)feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt(2 hunks)feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt(6 hunks)feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt(1 hunks)feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt(7 hunks)feature/setting/src/main/java/com/yapp/setting/EditBirthdayScreen.kt(2 hunks)feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt(1 hunks)feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt(5 hunks)feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt(4 hunks)feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt(0 hunks)feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt(1 hunks)feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt(1 hunks)feature/splash/src/main/java/com/yapp/splash/SplashViewModel.kt(1 hunks)
💤 Files with no reviewable changes (3)
- feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt
- feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt
- core/ui/src/main/java/com/yapp/ui/base/BaseViewModel.kt
🧰 Additional context used
🧬 Code Graph Analysis (8)
feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionNavGraph.kt (1)
feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt (1)
AlarmSnoozeTimerRoute(49-59)
feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt (2)
feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt (1)
handleSideEffect(94-139)feature/home/src/main/java/com/yapp/home/HomeScreen.kt (1)
handleSideEffect(133-173)
feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt (4)
feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt (1)
handleSideEffect(93-122)feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt (1)
handleSideEffect(92-121)feature/fortune/src/main/java/com/yapp/fortune/FortuneNavGraph.kt (1)
handleSideEffect(55-94)feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt (1)
MissionRoute(51-77)
feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt (5)
feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt (1)
handleSideEffect(58-67)feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt (1)
handleSideEffect(93-122)feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt (1)
handleSideEffect(92-121)feature/home/src/main/java/com/yapp/home/HomeScreen.kt (1)
handleSideEffect(133-173)core/ui/src/main/java/com/yapp/ui/component/snackbar/OrbitSnackBar.kt (1)
showCustomSnackBar(119-159)
feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt (2)
feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt (3)
refreshUserInfo(189-194)navigateBack(173-175)fetchUserInfo(112-141)feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt (1)
openWebView(247-249)
feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionViewModel.kt (1)
feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerViewModel.kt (3)
fetchIsFirstMission(47-55)startClock(57-87)dismiss(89-91)
feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt (2)
feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt (3)
navigateBack(60-62)refreshUserInfo(72-77)fetchUserInfo(42-58)feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt (1)
submitUserInfo(67-97)
feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt (2)
feature/fortune/src/main/java/com/yapp/fortune/FortuneViewModel.kt (1)
navigateToHome(106-108)core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt (1)
navigateToHome(48-50)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: build
🔇 Additional comments (37)
feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt (1)
58-59: Orbit MVI 리팩토링이 올바르게 적용되었습니다.
onAction에서processAction으로의 메소드 호출 변경이 일관되게 적용되어 BaseViewModel에서 Orbit MVI ContainerHost로의 전환이 정확히 이루어졌습니다.Also applies to: 66-66
feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionNavGraph.kt (1)
74-74: 네비게이션 파라미터 제거가 올바르게 적용되었습니다.
AlarmSnoozeTimerRoute의 시그니처 변경에 맞춰navigator파라미터가 제거되어 Orbit MVI 리팩토링과 일치합니다.feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt (1)
108-108: 액션 처리 메소드 변경이 일관되게 적용되었습니다.모든
onAction호출이processAction으로 올바르게 변경되어 Orbit MVI 패턴에 맞게 리팩토링되었습니다.Also applies to: 115-116, 126-126
feature/setting/src/main/java/com/yapp/setting/EditBirthdayScreen.kt (1)
35-51: 모든 액션 디스패치가 Orbit MVI 패턴으로 올바르게 업데이트되었습니다.
EditBirthdayRoute에서 모든onAction호출이processAction으로 일관되게 변경되어 BaseViewModel에서 Orbit MVI ContainerHost로의 전환이 완료되었습니다.feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt (1)
58-87: 복잡한 프로필 편집 화면에서도 Orbit MVI 리팩토링이 완벽하게 적용되었습니다.
EditProfileRoute의 모든 액션 디스패치가onAction에서processAction으로 일관되게 변경되어, 이름 업데이트, 성별 토글, 생년월일 관련 액션 등 모든 사용자 상호작용이 새로운 Orbit MVI 패턴을 따르도록 업데이트되었습니다.feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt (1)
16-16: LGTM! Orbit MVI의 관용적 패턴으로 개선
collectSideEffect를 사용하여 수동 side effect 수집을 대체한 것이 좋습니다. 코드가 더 간결해지고 Orbit MVI의 관용적 패턴을 따릅니다.Also applies to: 27-29, 37-39, 84-86
feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt (1)
12-12: 일관된 Orbit MVI 패턴 적용모든 composable에서
collectSideEffect를 일관되게 사용하여 side effect 처리를 개선했습니다.참고:
handleSideEffect함수가viewModel을 매개변수로 받아NavigateBack시 상태를 리셋하는 것은 유효한 설계 결정으로 보입니다.Also applies to: 20-22, 28-30, 36-38, 44-46, 52-54, 60-62, 68-70, 76-78, 84-86
feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt (2)
38-38: Side effect 처리 개선
collectSideEffect를 사용하여 manual flow collection을 대체한 것이 좋습니다. 코드가 더 간결하고 Orbit MVI 패턴에 맞습니다.Also applies to: 48-50
58-67: Side effect 핸들러 추출로 모듈성 향상Side effect 처리 로직을 별도 함수로 추출하여 관심사 분리와 코드 가독성이 개선되었습니다.
feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt (2)
10-10: Orbit MVI 관용구 적용
collectSideEffect를 사용하여 side effect 수집을 개선했습니다. 기존의 수동 coroutine 관리보다 더 명확하고 안전합니다.Also applies to: 24-26
32-49: Navigation side effect 처리 모듈화Side effect 처리 로직을 별도 함수로 추출하여 코드 구조가 개선되었습니다. Navigation 옵션도 적절히 설정되어 있습니다.
feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt (1)
25-25: Side effect 수집 패턴 개선
collectSideEffect를 사용하여 Orbit MVI의 관용적 패턴을 적용했습니다. 코드가 더 간결하고 명확해졌습니다.Also applies to: 34-36
feature/home/src/main/java/com/yapp/home/HomeScreen.kt (2)
80-86: Orbit MVI의collectSideEffect사용이 적절합니다!기존의 수동 side effect 수집 방식을 Orbit MVI의 표준 확장 함수로 대체한 것이 좋습니다. 이는 코드베이스 전반의 일관성을 향상시킵니다.
Also applies to: 123-131
133-173: Side effect 처리 로직의 모듈화가 잘 되었습니다!
handleSideEffect함수로 추출하여 코드의 가독성과 재사용성이 향상되었습니다. 모든 side effect 타입이 적절히 처리되고 있습니다.feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt (2)
70-72: Orbit MVI 패턴이 일관되게 적용되었습니다!다른 화면들과 동일한 방식으로
collectSideEffect를 사용하여 side effect를 처리하도록 변경되었습니다.Also applies to: 84-86
94-139: Side effect 처리가 명확하고 체계적입니다!각 side effect 타입별로 적절한 네비게이션 처리와 savedStateHandle 설정이 구현되었습니다.
SaveAlarm과 다른 케이스들의 네비게이션 방식 차이도 적절합니다.feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerViewModel.kt (3)
29-36: Orbit MVI ContainerHost 구현이 적절합니다!BaseViewModel을 제거하고 Orbit의 표준 패턴을 직접 사용하도록 변경되었습니다. container 초기화 시 필요한 로직을 intent로 실행하는 방식이 좋습니다.
41-45: 액션 처리 메서드가 잘 구현되었습니다!
processAction메서드 추가로 UI 이벤트 처리가 명확해졌습니다.
57-87: 타이머 로직의 Orbit intent 구현이 우수합니다!
while루프와reduce를 사용한 상태 업데이트가 깔끔하게 구현되었습니다. 타이머 종료 조건도 명확합니다.feature/splash/src/main/java/com/yapp/splash/SplashViewModel.kt (1)
20-26: ContainerHost 구현이 적절합니다!BaseViewModel 제거 후 Orbit의 표준 container 패턴을 사용하도록 변경되었습니다.
feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt (2)
22-30:repeatOnSubscription사용이 적절합니다!화면이 다시 표시될 때마다 사용자 정보를 새로고침하는 패턴이 좋습니다.
42-77: Orbit intent 패턴이 잘 적용되었습니다!모든 함수가
intent블록을 사용하고,reduce로 상태를 업데이트하며,postSideEffect로 side effect를 처리하는 방식이 일관되고 명확합니다.feature/home/src/main/java/com/yapp/home/HomeViewModel.kt (4)
38-50: Orbit MVI 컨테이너 초기화 패턴이 적절히 적용되었습니다
BaseViewModel에서ContainerHost로의 전환이 잘 이루어졌으며, 초기화 로직이repeatOnSubscription블록 내에 적절히 배치되었습니다.
84-102: intent 블록과 reduce 패턴이 올바르게 적용되었습니다상태 업데이트와 부수 효과 처리가 Orbit MVI 패턴에 맞게 잘 구현되었습니다.
168-197: 비동기 작업과 상태 관리가 효과적으로 통합되었습니다알람 상태 토글 로직이 Orbit MVI의 intent 패턴으로 잘 마이그레이션되었으며, 에러 처리도 적절히 유지되고 있습니다.
304-316: Flow 수집과 상태 업데이트가 적절히 구현되었습니다
intent블록 내에서 Flow를 수집하고 각 emission에 대해reduce를 사용하는 패턴이 올바르게 적용되었습니다.feature/fortune/src/main/java/com/yapp/fortune/FortuneViewModel.kt (3)
30-35: 컨테이너 초기화와 자동 데이터 로딩이 잘 구현되었습니다초기화 시
loadFortune()을 호출하여 필요한 데이터를 자동으로 로드하는 패턴이 적절합니다.
36-51: 액션 처리 구조가 명확하고 일관성 있게 구현되었습니다
processAction메서드가 각 액션을 개별 intent 함수로 적절히 위임하고 있어 코드의 가독성과 유지보수성이 향상되었습니다.
53-85: 함수 분리가 단일 책임 원칙(SRP)에 따라 잘 이루어졌습니다
loadFortune과fetchAndUpdateFortune으로 분리하여 각 함수의 책임이 명확해졌고, 코드의 가독성이 향상되었습니다.feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionViewModel.kt (3)
33-40: 컨테이너 초기화 순서가 적절합니다초기화 블록에서 필요한 데이터를 가져오고(
fetchIsFirstMission), 상태를 초기화한 후(initializeAlarmState), 시계를 시작하는(startClock) 순서가 논리적입니다.
71-89: 시계 업데이트 로직이 Orbit의 구조화된 동시성을 잘 활용하고 있습니다
intent블록 내의 무한 루프는 ViewModel의 생명주기와 함께 자동으로 관리되므로 메모리 누수 걱정이 없습니다.
91-105: 스누즈 로직과 상태 관리가 명확하게 구현되었습니다무제한 스누즈(-1) 케이스를 적절히 처리하고 있으며, 상태 업데이트와 네비게이션 부수 효과가 잘 분리되어 있습니다.
feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt (3)
26-45: 액션 처리가 체계적으로 구성되었습니다
processAction메서드가 모든 액션을 명확하게 처리하고 있으며, 각 액션이 전용 intent 함수로 위임되어 코드의 모듈성이 향상되었습니다.
47-110: 입력 유효성 검증이 상태 관리와 잘 통합되었습니다각 필드 업데이트 시 유효성 검증이 자동으로 수행되어 상태의 일관성이 보장됩니다.
177-200: 헬퍼 함수들이 단일 책임 원칙에 따라 잘 구성되었습니다
resetState,showDialog,hideDialog등의 헬퍼 함수들이 명확한 책임을 가지고 있어 코드의 가독성과 유지보수성이 향상되었습니다.feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt (2)
40-47: 컨테이너 초기화가 적절히 구현되었습니다알람 해제 인텐트 전송과 미션 타입 로드가 초기화 시점에 올바르게 처리되고 있습니다.
77-117: 미션 처리 로직이 명확하고 체계적입니다미션 타입별 처리가 잘 분리되어 있고, 상태 업데이트와 애니메이션 타이밍이 적절히 관리되고 있습니다.
|
🚀 테스트 완료 및 커버리지 리포트가 생성되었습니다. |
|
🚀 테스트 완료 및 커버리지 리포트가 생성되었습니다. |
MoonsuKang
left a comment
There was a problem hiding this comment.
읽는데만 한 시간 걸렸네요 ㅋㅋㅋ
외부 프레임워크를 사용할꺼면 BaseViewModel를 안쓰는게 좋은거 같다고 생각은 합니다...
viewModelScope.launch -> intent {} 로 바뀐 부분에 대해 제가 이해한 게 맞는지 검증좀
- 내부적으로 viewModelScope.launch를 사용하긴 하지만,
- Orbit의 intentQueue에 등록되어 sequential하게 실행되고,
- reduce, state 접근 시 항상 최신 상태를 보장해줌
-> 결과적으로 동시성 이슈나 상태 충돌 없이 안전하게 처리 가능하다?
val realContainer: Container<STATE, SIDE_EFFECT> =
viewModelScope.container(state, buildSettings, onCreate)override val scope: CoroutineScope = parentScope + settings.eventLoopDispatcher
private val intentJob = Job(scope.coroutineContext[Job])
private val dispatchChannel = Channel<Pair<CompletableJob, suspend ContainerContext<STATE, SIDE_EFFECT>.() -> Unit>>(Channel.UNLIMITED)위 코드에서 알 수 있듯이 viewModel 내에서 Container를 생성하면 parentScope(=viewModelScope)를 주입받습니다. override fun orbit(orbitIntent: suspend ContainerContext<STATE, SIDE_EFFECT>.() -> Unit): Job {
initialiseIfNeeded()
val job = Job(intentJob)
dispatchChannel.trySend(job to orbitIntent)
return job
}
@OrbitDsl
internal fun <STATE : Any, SIDE_EFFECT : Any> Container<STATE, SIDE_EFFECT>.intent(
registerIdling: Boolean = true,
transformer: suspend ContainerContext<STATE, SIDE_EFFECT>.() -> Unit
): Job = orbit {
withIdling(registerIdling) {
transformer()
}
}intent 함수는 내부적으로 orbit { } 을 호출하며, 이는 위에서 주입받은 viewModelScope 기반의 CoroutineScope에서 실행됩니다. 또한, orbit { } 호출 시 intent가 dispatchChannel에 등록되어 순차적으로 실행되기 때문에 intent 내에서 state 접근 시 항상 최신 상태를 가져올 수 있는 것으로 압니다! |
Related issue 🛠
closed #231
어떤 변경사항이 있었나요?
CheckPoint ✅
PR이 다음 요구 사항을 충족하는지 확인하세요.
Work Description ✏️
사용하던 BaseViewModel이 오히려 가독성 및 예상치 못한 동작을 발생시키므로 제거하였습니다.
Uncompleted Tasks 😅
To Reviewers 📢
이슈 읽어보심 좋아요
Summary by CodeRabbit
리팩터
스타일/코드 정리
버그 수정
기능 개선