我想将 MVVM 与 Firebase 一起实现到我的应用中。我在很多博客中读到,我需要转换来将 View 模型与存储库连接起来,但我仍然无法真正做到这一点。
我想在更新“callback”后使用存储库中“callback”的值更新“callbackSignUp”。我知道我的转换可能是错误的,但我想要一些答案:
1) 运行应用程序需要什么代码?
2) 我需要向转换添加函数吗?这个函数的用途是什么?
3) 许多人在源代码后使用“input ->”,但这是什么意思?我在函数中需要它吗?
4)如果可能的话请向我解释一下map和switchmap的功能。读了很多遍还是没明白。
谢谢:)
View 模型
public class SignUpViewmodel extends AndroidViewModel {
private UserRepository userRepo;
public LiveData<Boolean> callbackSignUp = Transformations.map(userRepo.callback, input -> {
if (input.booleanValue()){
return true;
}
return false;
});
public SignUpViewmodel(@NonNull Application application) {
super(application);
userRepo = UserRepository.getInstance();
}
void signUp(String username, String email, String password, Date birthday, char gender, boolean receiveEmail){
userRepo.signUp(email,password);
Log.d(TAG, "signUp: COMPLETE");
}
}
存储库
public class UserRepository {
private static UserRepository instance = null;
private FirebaseAuth mAuth;
public LiveData<Boolean> callback;
public static synchronized UserRepository getInstance(){
if(instance == null){
instance = new UserRepository();
}return instance;
}
public void signUp(String email, String password){
mAuth = FirebaseAuth.getInstance();
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful()){
Log.d(TAG, "onComplete: SUCCESS");
callback = new MutableLiveData<>(true);
}else{
Log.d(TAG, "onComplete: FAILED");
callback = new MutableLiveData<>(false);
}
}
});
}
}
Activity
model.callbackSignUp.observe(this, new Observer<Boolean>() {
@Override
public void onChanged(Boolean aBoolean) {
Toast.makeText(SignUpActivity.this, ""+ aBoolean, Toast.LENGTH_SHORT).show();
}
});
最佳答案
Transformations.map
是一个实用函数,可帮助您将类型 a 的 LiveData 转换为类型 b 的 LiveData。 a -> b 转换是通过您在 map
函数中传递的回调完成的。 Tranformations.switchMap
是另一个实用函数,它返回单个 LiveData,当触发器 LiveData 更改时,该函数会更改其源事件。例如:假设您有一个管理不同帐户的应用程序。当前帐户存储在名为 userLiveData
的 LiveData 中。现在数据库中有一个表,每个帐户都有用户的个人信息,并且必须在用户界面上显示它们。你应该写这样的东西:
infoLiveData = Tranformations.switchMap(userLiveData, user -> {
return repository.getInfoLiveDataOf(user);
})
如您所见,您有一个用于 ui 更新的 LiveData,每次 userLiveData 更改其值时,infoLiveData 都会将其源事件切换到 repository.getInfoLiveData(user)
返回的新 LiveData。这使得你的代码真正具有反应性。现在,在您的情况下,您有不同的 LiveData,应将其映射到单个 LiveData 中。 map
函数的使用在您的代码中不是 util 。我认为最好的方法是使用单个 MutableLiveData,在调用 SignUp 函数时输入 true 或 false,而无需每次创建不同的 LiveData。
关于java - 将数据从存储库转换为 Viewmodel 的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59848578/