如何处理ViewModel内部服务类中触发的事件?建筑组件,Kotlin,Firebase)

时间:2019-03-16 16:46:16

标签: android firebase kotlin architecture firebase-authentication

我正在寻找一种方法来对诸如viewmodel之内的{ "query": { "prefix": { "name.keyword": "smith joh" } } 等事件做出反应。

例如:

我创建了一个名为EmailSignInService的类,该类在用户登录的情况下从firebase实例调用onComplete(), onFailure()。我想在viewmodel中处理此事件以更新UI。

EmailSignInService

OnCompleteListener

LoginViewModel

    fun signInUser(email: String, password: String) {
    auth.signInWithEmailAndPassword(email, password).
        addOnCompleteListener(OnCompleteListener<AuthResult> { task -> {
        if(task.isSuccessful) {
            val currentUser = auth.currentUser;
            // inform somehow viewmodel to change UI state later
        } //...
    } });
}

一种选择是创建一个接口,并将其作为参数传递给class LoginViewModel : ViewModel() { var userName: String? = null; //... var userPassword: String? = null; //... // Button on click fun LoginUser() { // Create an instance of signin service and get result to inform UI } (回调),然后在EmailSignInService中调用相应的方法。 addOnCompleteListener还必须实现接口,并将逻辑放入相应的方法中。

还有其他更好的方法来处理这种情况吗?

1 个答案:

答案 0 :(得分:2)

您真的不想在ViewModel中处理Firebase事件。 ViewModel不应理解您的数据源的实现细节。假设通常通过包含所有实现详细信息的存储库对象公开的LiveData对象对有关数据源的抽象进行操作。 LiveData可以将Firebase Task对象中的数据代理回ViewModel。

一个非常粗糙的设计(您应该更健壮并处理错误):

data class UserData {
    // information about the logged in user, copied from FirebaseUser
}

class UserRepository {
    fun newUser(): LiveData<UserData> {
        // Sign in with Firebase Auth, then when the Task is
        // complete, create a UserData using the data from
        // the auth callback, then send it to the LiveData
        // that was returned immediately
    }
}

class LoginViewModel : ViewModel() {
    private val repo = UserRepository()
    fun signInNewUser() {
        val live: LiveData<UserData> = repo.newUser()
        // observe the LiveData here and make changes to views as needed
    }
}