0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

KMP FirebaseAuthを使ってログインViewModel作成編 〜ゼロからの KMP × Firebase〜

Last updated at Posted at 2025-11-02

前回はFirebaseAuthRepositoryを作成しました。

今回はViewModelを実装していきます。

LoginViewModel

LoginViewModel.kt

class LoginViewModel(
    private val loginUsaCase: LoginUsaCaseImpl = LoginUsaCaseImpl(firebaseAuthRepository = FirebaseAuthRepositoryImpl())
): ViewModel() {
    private val _uiState = MutableStateFlow(AuthUiState())
    val uiState: StateFlow<AuthUiState> = _uiState

    // 完了通知
    private val _signInCompleted = MutableStateFlow(false)
    val signInCompleted: StateFlow<Boolean> = _signInCompleted

    // 入力変更
    fun onEmailChanged(value: String) {
        _uiState.value = _uiState.value.copy(email = value)
    }

    // 入力変更
    fun onPasswordChanged(value: String) {
        _uiState.value = _uiState.value.copy(password = value)
    }

    // 表示変更
    fun onShowPasswordChanged() {
        _uiState.value = _uiState.value.copy(showPassword = !_uiState.value.showPassword)
    }

    /**
     * サインアップ処理
     */
    fun signIn() {
        val emailError = Validator.validateEmail(uiState.value.email)
        _uiState.value = _uiState.value.copy(
            emailError = emailError,
        )
        if (emailError != null) {
            return
        }
        viewModelScope.launch {
            _uiState.value = _uiState.value.copy(isLoading = true)
            try {
                loginUsaCase.signIn(
                    uiState.value.email,
                    uiState.value.password
                )
                _uiState.value = _uiState.value.copy(
                    isLoading = false,
                    generalError = null
                )
                completeSignIn()
            } catch (e: Exception) {
                _uiState.value = _uiState.value.copy(
                    isLoading = false,
                    generalError = e.message
                )
            }
        }
    }
    
    fun completeSignIn() {
        _signInCompleted.value = true
    }
}

Androidで普段使用するとしたらこのような実装になるかと思います。
ただ、このままではAndroidの機能を使用している為iOSで使用することはできません。
なのでSwiftでも使用できるように変更が必要です。
UsaCaseの実装は特に複雑なことしていない為、省略します。

次回予告

Swiftでも使用できるように実装します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?