앱 내에서 userId, userIdx 값을 활용하여 통신하는 경우가 많아서 dataStore에 값을 저장하고 있다. 해당 값들을 사용하는 페이지의 경우에는 ViewModel의 init 블록에서 dataStore에 저장되어 있는 값들을 꺼내오고 서버 통신에 활용하려고 했는데 init 블록보다 LaunchedEffect의 호출이 더 빨라서 의도한 대로 동작하지 않았다.
@HiltViewModel
class HomeViewModel @Inject constructor(
private val userRepository: UserRepository,
private val deviceRepository: DeviceRepository,
private val dataStore: LuxnineDataStore
) : BaseViewModel<HomePageState>(
HomePageState()
) {
init {
viewModelScope.launch {
combine(
dataStore.userIdx,
dataStore.userId
) { userIdx, userId ->
Pair(userIdx ?: -1, userId ?: "")
}.collect { (userIdx, userId) ->
updateState(
uiState.value.copy(
userIdx = userIdx,
userId = userId
)
)
}
}
}
// 생략..
val viewModel: HomeViewModel = hiltViewModel()
// 생략
LaunchedEffect(key1 = Unit) {
viewModel.getUserInfo()
viewModel.getUserDevice()
}
// 생략
init보다 LaunchedEffect가 더 빨리 호출되고 있어서 이상한 값으로 서버에 데이터를 요청하고 있었고 이를 해결하기 위해 LaunchedEffect의 키값을 userId, userIdx로 설정하고 제대로 된 값이 아니라면 서버에 요청하지 않도록 변경하였다.
LaunchedEffect(key1 = uiState.userId, key2 = uiState.userIdx) {
if (uiState.userId.isNotEmpty() && uiState.userIdx != -1L) {
viewModel.getUserInfo()
viewModel.getUserDevice()
}
}
잘 보고 갑니다~^^..좋은.,개발자가..되실듯..아자아자