728x90
이번에는 ViewModel에 대해서 어떤식으로 구성을 하였는지에 대해서 보이려고 한다.
코드
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.sangsangstagram.data.AuthRepository
import com.google.firebase.auth.ktx.auth
import com.google.firebase.ktx.Firebase
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
class LoginViewModel : ViewModel() {
private val _uiState = MutableStateFlow(LoginUiState())
val uiState = _uiState.asStateFlow()
val signedIn: Boolean
get() = AuthRepository.isSignedIn()
fun updateEmail(email: String) {
_uiState.update { it.copy(email = email) }
}
fun updatePassword(password: String) {
_uiState.update { it.copy(password = password) }
}
fun signIn() {
val email = uiState.value.email
val password = uiState.value.password
_uiState.update { it.copy(isLoading = true) }
viewModelScope.launch {
val result = AuthRepository.signIn(email, password)
if (result.isSuccess) {
_uiState.update { it.copy(successToSignIn = true, isLoading = false) }
} else {
_uiState.update {
it.copy(
userMessage = result.exceptionOrNull()!!.localizedMessage,
isLoading = false
)
}
}
}
}
fun checkUserInfoExists(hasUserInfoCallback: (Boolean) -> Unit) {
val uid = Firebase.auth.currentUser?.uid
if (uid == null) {
hasUserInfoCallback(false)
return
}
AuthRepository.hasUserInfo(uid) {
hasUserInfoCallback(it)
}
}
fun userMessageShown() {
_uiState.update { it.copy(userMessage = null) }
}
}
- 상속 및 속성:
- 이 클래스는 ViewModel을 확장하며, UI 관련 데이터를 라이프사이클에 맞게 관리하는 Android Architecture Components의 일부입니다.
- LoginUiState 유형의 개인 가변 상태 플로우 _uiState 및 공용 읽기 전용 상태 플로우 uiState가 있습니다. 상태 플로우는 Kotlin Flow의 일부로 비동기 값 스트림을 나타내는 데 사용됩니다.
- 초기화:
- _uiState는 초기 LoginUiState 인스턴스로 초기화됩니다.
- 속성 및 메서드:
- signedIn은 사용자가 로그인되어 있는지 여부를 나타내는 읽기 전용 속성으로, AuthRepository의 isSignedIn 메서드에 의존합니다.
- updateEmail 및 updatePassword는 각각 이메일 및 비밀번호 속성을 _uiState에서 업데이트하는 메서드입니다.
- signIn은 로그인 프로세스를 시작하는 메서드로, _uiState를 업데이트하여 로딩 중임을 나타내고, 코루틴을 사용하여 AuthRepository.signIn을 수행하며 결과에 따라 UI 상태를 업데이트합니다.
- checkUserInfoExists는 사용자 정보가 있는지 확인하는 메서드로, AuthRepository의 hasUserInfo 메서드를 사용하고 결과를 hasUserInfoCallback을 통해 제공합니다.
- userMessageShown은 UI 상태의 사용자 메시지를 null로 재설정하는 메서드입니다.
- 코루틴:
- signIn 메서드는 비동기 작업을 수행하기 위해 viewModelScope.launch를 사용하여 코루틴을 시작합니다.
- Firebase 통합:
- 코드는 Firebase 인증(Firebase.auth)을 사용하여 현재 사용자의 UID를 가져오고 사용자 정보가 있는지 확인합니다.
- UI 상태 관리:
- UI의 상태는 LoginUiState 클래스를 통해 관리되며, uiState 플로우는 UI 구성 요소에 의해 관찰되어 UI를 업데이트합니다.
- 오류 처리:
- 코드는 로그인 작업의 결과를 처리하고 성공 또는 오류 정보로 UI 상태를 업데이트합니다. 오류 발생 시 예외 메시지가 캡처되어 사용자 메시지로 표시됩니다.
코드는 주로 Android 개발에서 사용되는 MVVM (Model-View-ViewModel) 아키텍처를 따르며, UI 관련 로직을 UI 구성 요소에서 분리합니다. Firebase를 사용하여 인증을 처리하며 UI 상태를 업데이트하고 관찰하기 위한 메서드를 제공합니다.
728x90
'Android > Study' 카테고리의 다른 글
[Android] 포스팅 업로드 구현 (1) - Activity (0) | 2024.02.26 |
---|---|
[Android] 로그인 기능 구현 (4) - Repository (0) | 2024.02.09 |
[Android] ktlint, detekt를 적용해보기 (0) | 2024.01.20 |
[Android] android에서 multipart로 image 전송 및 받아오기 (0) | 2024.01.14 |
[Android] 로그인 기능 구현 (2) - UiState (0) | 2024.01.14 |