UiState не обновляется должным образомAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 UiState не обновляется должным образом

Сообщение Anonymous »

Каждый раз, когда я запускаю «FavoritePost» или «DeletePost», и в uiState выбран TAB_TWO (Избранное), он либо переключается на TAB_ONE, остается в TAB_TWO, но отображает все сообщения вместо только избранных или просто работает правильно. p>
Вот 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)
}
}
}
}
}
ViewModelTemplate:

Код: Выделить всё

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)
}
}
Я использую RoomDB, если это помогает, но я искренне считаю, что проблема в том, как я обрабатываю потоки внутри ViewModel.
А также, если вам есть что сказать добавьте информацию о моем коде в целом, пожалуйста, я хочу научиться!
Я могу гарантировать, что проблема не в том, как я обрабатываю события в составном элементе.
Пытался централизовать обработку StateFlow внутри одной функции (ничего не изменилось)
Ура!>

Подробнее здесь: https://stackoverflow.com/questions/790 ... s-expected
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»