封装BaseViewModel
This commit is contained in:
@@ -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) }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user