Вот ViewModel этого экрана:
Код: Выделить всё
@HiltViewModel
class MainViewModel @Inject constructor(
private val repo: MainRepository
) : ViewModelTemplate(MainState()) {
init {
initState()
}
override fun initState() {
d("MainViewModel", "Initialized posts")
viewModelScope.launch {
repo.getPosts()
.distinctUntilChanged()
.collectLatest {
_uiState.emit(
_uiState.value.copy(posts = it)
)
}
}
}
override fun onEvent(event: MainScreenEvents) {
when (event) {
is ChangeTab -> {
viewModelScope.launch {
d("MainViewModel", "Changing to ${event.tabNumber}")
when (event.tabNumber) {
TAB_ONE -> repo.getPosts()
TAB_TWO -> repo.getFavoritedPosts()
}.distinctUntilChanged()
.collect {
_uiState.emit(
_uiState.value.copy(
selectedTab = event.tabNumber,
posts = it
)
)
}
}
}
is DeletePost -> {
viewModelScope.launch {
repo.setDeletedPost(event.post)
if (event.post.isFavorited)
repo.setFavoritePost(event.post)
}
}
is FavoritePost -> {
viewModelScope.launch {
repo.setFavoritePost(event.post)
}
}
}
}
}
Код: Выделить всё
abstract class ViewModelTemplate(initialState: T) : ViewModel() {
protected val _uiState: MutableStateFlow = MutableStateFlow(initialState)
val uiState: StateFlow = _uiState
protected open fun initState() {
d("viewmodel", "I did nothing!")
}
abstract fun onEvent(event: R)
}
Код: Выделить всё
sealed class Events {
sealed class MainScreenEvents : Events() {
data class FavoritePost(val post: PostsEntity) : MainScreenEvents()
data class DeletePost(val post: PostsEntity) : MainScreenEvents()
data class ChangeTab(val tabNumber: MainScreenTabId) : MainScreenEvents()
}
sealed class DeletedPostsScreenEvents : Events() {
data class CheckPost(val post: DeletedPosts) : DeletedPostsScreenEvents()
data object RestorePosts : DeletedPostsScreenEvents()
data object RestoreAllPosts : DeletedPostsScreenEvents()
}
sealed class PostScreenEvents : Events() {
data class PostEntity(val title: String, val body: String) : PostScreenEvents()
}
}
Код: Выделить всё
enum class MainScreenTabId(val text: String, val icon: ImageVector) {
TAB_ONE("Home", Default.Home),
TAB_TWO("Favorite", Default.Favorite)
}
Код: Выделить всё
sealed class States {
data class MainState(
val posts: List = emptyList(),
val selectedTab: MainScreenTabId = TAB_ONE
) : States()
data class DeletedPostsState(
val posts: List = emptyList()
) : States()
data object EmptyState : States()
}
Код: Выделить всё
class MainRepository @Inject constructor(
private val postsService: PostsServiceImplementation,
private val postsDao: PostsDao
) {
init {
CoroutineScope(IO).launch {
postsDao.updateDbFromClient(
postsService.getPosts().map {
it.toEntity()
})
}
}
fun getPosts(): Flow {
return postsDao.getAvailablePosts()
}
fun getFavoritedPosts(): Flow {
return postsDao.getFavoritedPosts()
}
fun getDeletedPosts(): Flow {
return postsDao.getDeletedPosts()
}
suspend fun setFavoritePost(post: PostsEntity) {
postsDao.updatePost(post.copy(isFavorited = !post.isFavorited))
}
suspend fun setDeletedPost(post: PostsEntity) {
postsDao.updatePost(post.copy(isDeleted = !post.isDeleted))
}
suspend fun createPosts(postRequest: PostRequest): PostResponse? {
return postsService.createPosts(postRequest)
}
}
А также, если вам есть что сказать добавьте информацию о моем коде в целом, пожалуйста, я хочу научиться!
Я могу гарантировать, что проблема не в том, как я обрабатываю события в составном элементе.
Пытался централизовать обработку StateFlow внутри одной функции (ничего не изменилось)
Ура!>
Подробнее здесь: https://stackoverflow.com/questions/790 ... s-expected
Мобильная версия