java - 将数据从存储库转换为 Viewmodel 的数据

标签 java android firebase mvvm transformation

我想将 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/

相关文章:

java - 创建 Java 单例类的 2 个实例

Android禁用菜单点击声音

java - Android:无法在 Activity 中显示从 Firebase 检索到的 POJO 到 GridView

java - 使用 Android 2.2 时 TTS 抛出 NPE,但在 4.0 版本上运行良好

firebase - 如何知道哪个registration_id是坏的/过期的/已删除的

angular - 如何使用 Firebase 将新项目推送到数组中

java - 如何使用 Hibernate Criteria API 从连接表中选择不同的表?

java - 如何为 Eclipse 插件制作动态上下文菜单?

java - 编码bat array2 no14

android - Camera Intent,FileUriExposedException,将图像保存在存储中并检索图像位图和文件路径