Reputation: 9
// 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)
}
)
}
}
}
combine
and collectLatest
are used.createPost
-> It is set properlycreatePost
function is called, the StateFlow
value is checked to see if it is the latest value, but it is set to the initial value within the function.Upvotes: 0
Views: 95
Reputation: 348
You do not call your PostBoardViewModel.createPost()
function anywhere.
Perhaps, that is the reason?
Upvotes: 0