Как я могу решить проблему, когда значения StateFlow не обновляются?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как я могу решить проблему, когда значения StateFlow не обновляются?

Сообщение Anonymous »

Как устранить проблему, когда значения StateFlow не обновляются?
  • Значение StateFlow не присвоено объекту BoardRequestDto.
  • Последнее значение StateFlow не собирается должным образом в функции createPost.

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

// PostBoardViewModel.kt
@HiltViewModel
class PostBoardViewModel @Inject constructor(
private val boardRepository: BoardRepository,
) : ViewModel() {
private val _uiState = MutableStateFlow(PostBoardUiState.Initial)
val uiState: StateFlow = _uiState

private val _title = MutableStateFlow("")
val title: StateFlow = _title

private lateinit var boardRequestDto: BoardRequestDto

private fun updateTitle(newTitle: String) {
_title.value = newTitle
Log.d("PostBoardViewModel", "Title updated: ${title.value}")
}

private fun createPost() {
viewModelScope.launch {
_uiState.value = PostBoardUiState.Loading

boardRequestDto = BoardRequestDto(
title = title.value,
// ...
)

Log.d("PostBoardViewModel", "BoardRequestDto created: $boardRequestDto")

try {
Log.d("PostBoardViewModel", "Attempting to post board")

val result = boardRepository.postBoard(boardRequestDto)
Log.d("PostBoardViewModel", "API response: $result")

when {
result.data != null -> {
val boardIdDto = result.data
_createdBoardIds.value += boardIdDto!!.boardId
_uiState.value = PostBoardUiState.Success(boardIdDto)
Log.d(
"PostBoardViewModel",
"Post created successfully with ID: ${boardIdDto.boardId}"
)
}

result.error != null -> {
val errorMessage = result.error!!.message
_uiState.value = PostBoardUiState.Error(errorMessage)
Log.e("PostBoardViewModel", "Error creating post: $errorMessage")
}

else ->  {
_uiState.value = PostBoardUiState.Error("unknown error")
Log.e(
"PostBoardViewModel",
"Unknown error occurred while creating post"
)
}
}
} catch (e: Exception) {
_uiState.value = PostBoardUiState.Error("netword error: ${e.message}")
Log.e("PostBoardViewModel", "Exception while creating post", e)
}
}
}
}

// Enum class: PreferredGender, PreferredAge, Region, Category, BoardStatus
enum class PreferredGender {
SAME, ANY
}

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

// BoardRepository.kt
interface BoardRepository {
suspend fun postBoard(board: BoardRequestDto): ResultResponse
}

// ResultResponse
data class ResultResponse(
var data: T? = null,
var error: ResponseError? = null
)

@Serializable
data class ResponseError(
val status: Int,
val code: String,
val message: String
)

// BoardRequestDto.kt
@Serializable
data class BoardRequestDto(
val title: String,
// ...
)

// BoardIdDto.kt
@Serializable
data class BoardIdDto(
val boardId: Int
)

// PostBoardIntent.kt
sealed class PostBoardIntent {
data object CreatePost : PostBoardIntent()
}

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

// PostBoardScreen.kt
@Composable
fun PostBoardScreen(
viewModel: PostBoardViewModel = hiltViewModel()
) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()

val title by viewModel.title.collectAsStateWithLifecycle()

when(uiState) {
is PostBoardUiState.Initial ->
Column {
AccompanyTitleInput(
title = title,
onTitleChange = {
viewModel.handleIntent(PostBoardIntent.UpdateTitle(it))
}
)
// ...
}
is PostBoardUiState.Loading -> CircularProgressIndicator()
is PostBoardUiState.Success ->
Column {
AccompanyTitleInput(
title = title,
onTitleChange = {
viewModel.handleIntent(PostBoardIntent.UpdateTitle(it))
}
)
// ...
}
}
// Receives a value for each item from the user
// When you click the post button on the top bar, a post is created.
}

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

// GetTopBar Function in MainActivity.kt (app module)
@Composable
fun GetTopBar(
currentRoute: String?,
navController: NavHostController
) {
val viewModel: PostBoardViewModel = hiltViewModel()

// TopAppBar of PostBoardScreen
Screen.Post.route -> {
BackButtonWithTitleTopAppBar(
screenTitle = "동행 모집하기",
onNavigateUp = { navController.navigateUp() },
onPostClick = {
viewModel.handleIntent(PostBoardIntent.CreatePost)
navController.navigate(Screen.Home.route)
}
)
}
}
}
Как я пробовал
  • Значения не собираются даже при объединении и CollectLatest используются.
  • Проверьте, правильно ли установлено значение перед вызовом createPost -> Оно установлено правильно
  • До тех пор, пока не будет создан createPost< /code>, значение StateFlow проверяется на предмет того, является ли оно последним значением, но ему присваивается начальное значение внутри функции.
  • Copilot и GPT не решают проблему


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

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

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

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

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

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