我正在寻找一种方法来对诸如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
还必须实现接口,并将逻辑放入相应的方法中。
还有其他更好的方法来处理这种情况吗?
答案 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
}
}