簡體   English   中英

Firebase 使用 Kotlin 流進行身份驗證

[英]Firebase Auth with Kotlin Flow

我正在學習干凈的架構和 Kotlin Flow。 我想檢查 Firebase Auth 庫中是否存在用戶郵件。 但是,當我向流程 function 拋出錯誤時,應用程序崩潰了。

檢查用戶用例.kt

class CheckUserUseCase @Inject constructor(private val repository: SignInRepository) {
    operator fun invoke(mail: String): Flow<Status<Boolean, String>> = flow {
        emit(Status.Loading(data = null))

        try {
            repository.isUserExists(mail = mail)
            emit(Status.Success(data = true))
        } catch (e: Exception) {
            emit(Status.Error(message = e.message, data = false))
        }
    }
}

SignInRepository.kt

interface SignInRepository {
    suspend fun isUserExists(mail: String)
}

SignInRepositoryImpl.kt

class SignInRepositoryImpl @Inject constructor(private val firebaseUserActions: FirebaseUserActions) : SignInRepository {
    override suspend fun isUserExists(mail: String) {
        firebaseUserActions.isUserExists(mail = mail)
    }
}

FirebaseAuthentication.kt

class FirebaseAuthentication @Inject constructor(private val auth: FirebaseAuth) : FirebaseUserActions {
    override suspend fun isUserExists(mail: String){
        auth.fetchSignInMethodsForEmail(mail).addOnCompleteListener { task ->
            task.result.signInMethods?.let {
                if (it.size != 0) Log.i("App.tag", "True.")
                else throw IOException() <-- Crash point.
            }
        }.addOnFailureListener { e -> e.printStackTrace() }
            .await()
    }
}

如何將 state 返回到 Kotlin Flow 方法? 謝謝!

請嘗試以下方法:

override suspend fun isUserExists(mail: String): Status {
    return try {
        val result = auth.fetchSignInMethodsForEmail(mail).await()
        result.signInMethods?.let {
            if (it.isNotEmpty()) {
                Status.Success(data = true)
            } else {
                Status.Error(message = "No data", data = false)
            }
        } ?: Status.Error(message = "No Data", data = false)
    } catch (e: Exception) {
        Status.Error(message = e.message, data = false)
    }
}

CheckUserUseCase class 中只發出調用isUserExists()的結果:

emit(Status.Loading(data = null))
emit(repository.isUserExists(mail = mail))

顯示崩潰日志,它究竟在哪一行崩潰。

編輯:試試

it.size != 0 && it.size != null

if (task.isSuccessful()) {
[...]
     task.result.signInMethods?.let {
[...]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM