封装BaseViewModel

This commit is contained in:
Hsy
2025-10-15 15:03:16 +08:00
parent 6e8529caad
commit 05ff710872
24 changed files with 727 additions and 333 deletions

View File

@@ -1,13 +1,12 @@
package com.taskttl.data.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.taskttl.core.viewmodel.BaseViewModel
import com.taskttl.data.repository.CategoryRepository
import com.taskttl.data.repository.OnboardingRepository
import com.taskttl.data.state.OnboardingEvent
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.receiveAsFlow
import com.taskttl.data.state.OnboardingEffect
import com.taskttl.data.state.OnboardingIntent
import com.taskttl.data.state.OnboardingState
import kotlinx.coroutines.launch
/**
@@ -20,30 +19,37 @@ import kotlinx.coroutines.launch
*/
class OnboardingViewModel(
private val onboardingRepository: OnboardingRepository,
private val categoryRepository: CategoryRepository
) : ViewModel() {
private val categoryRepository: CategoryRepository,
) : BaseViewModel<OnboardingState, OnboardingIntent, OnboardingEffect>(initialState = OnboardingState()) {
private val _events = Channel<OnboardingEvent>()
val events: Flow<OnboardingEvent> = _events.receiveAsFlow()
override fun handleIntent(intent: OnboardingIntent) {
when (intent) {
is OnboardingIntent.NextPage -> nextPage()
is OnboardingIntent.MarkOnboardingCompleted -> markOnboardingCompleted()
}
}
/**
* 发送事件 - 提供统一的事件发送机制
* @param event 事件
* 下一页
*/
fun sendEvent(event: OnboardingEvent) {
viewModelScope.launch {
_events.trySend(event)
}
private fun nextPage() {
sendEvent(OnboardingEffect.NextPage)
}
/**
* 标记引导完成
*/
fun markOnboardingCompleted() {
private fun markOnboardingCompleted() {
viewModelScope.launch {
categoryRepository.initializeDefaultCategories()
onboardingRepository.markLaunched()
_events.trySend(OnboardingEvent.NavMain)
try {
if (state.value.isProcessing) return@launch
updateState { copy(isLoading = false, isProcessing = true) }
categoryRepository.initializeDefaultCategories()
onboardingRepository.markLaunched()
sendEvent(OnboardingEffect.NavMain)
} finally {
updateState { copy(isLoading = false, isProcessing = false) }
}
}
}
}
}