Bumblebee
Bumblebee

Reputation: 9

How can I fix the issue of StateFlow values not updating?

How can I fix the issue of StateFlow values not updating?

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

    private val _title = MutableStateFlow("")
    val title: StateFlow<String> = _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<BoardIdDto>
}

// ResultResponse
data class ResultResponse<T>(
    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)
                }
            )
        }
    }
}

How I Tried

Upvotes: 0

Views: 95

Answers (1)

Oleh Kuchura
Oleh Kuchura

Reputation: 348

You do not call your PostBoardViewModel.createPost() function anywhere.

Perhaps, that is the reason?

Upvotes: 0

Related Questions