Преобразование данных из репозитория в данные для Viewmodel - PullRequest
0 голосов
/ 21 января 2020

Я хочу внедрить MVVM в свое приложение вместе с Firebase. Я читал во многих блогах, что трансформации - это то, что мне нужно, чтобы связать модель представления с репозиторием, но я все еще не могу это сделать.

Я хочу обновить "callbackSignUp" со значением "callback" в репозитории после "обратного вызова" обновляется. Я знаю, что, вероятно, мое Преобразование неверно, но я хотел бы получить ответы на следующие вопросы:

1) Какой код необходим для запуска приложения?

2) Нужно ли добавить функция трансформации? И к чему применяется эта функция?

3) Многие используют «input ->» после своего источника, но что это значит? И нужно ли мне это в функции?

4) Если возможно, объясните мне функцию map и switchmap. Прочитав его много раз, я все еще не понимаю.

Спасибо:)

Viewmodel


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);
                        }
                    }
                });

    }


}

Активность

model.callbackSignUp.observe(this, new Observer<Boolean>() {
            @Override
            public void onChanged(Boolean aBoolean) {
                Toast.makeText(SignUpActivity.this, ""+ aBoolean, Toast.LENGTH_SHORT).show();
            }
        });

1 Ответ

0 голосов
/ 21 января 2020

Transformations.map - это служебная функция, которая помогает преобразовать LiveData типа a в LiveData типа b. Преобразование a -> b выполняется обратным вызовом, который вы передаете функции map. Tranformations.switchMap - это еще одна служебная функция, которая возвращает одну LiveData, которая изменяет исходные события при изменении триггера LiveData. Например: представьте, что у вас есть приложение, которое управляет различными учетными записями. Текущая учетная запись хранится в LiveData с именем userLiveData. Теперь у вас есть таблица в БД, в которой для каждой учетной записи есть личная информация пользователя, и они должны отображаться на пользовательском интерфейсе. Вы должны написать что-то вроде этого:

infoLiveData = Tranformations.switchMap(userLiveData, user -> {
    return repository.getInfoLiveDataOf(user);
})  

Как вы видите, у вас есть одна LiveData для обновлений пользовательского интерфейса, и каждый раз, когда userLiveData меняет свое значение, infoLiveData переключает свои исходные события на новые LiveData, возвращаемые repository.getInfoLiveData(user). Это делает ваш код действительно реактивным. Теперь в вашем случае у вас есть разные LiveData, которые должны быть отображены в одной LiveData. Использование функции map не используется в вашем коде. Я думаю, что лучший способ - это использовать один MutableLiveData, где вы ставите true или false, когда вызываете функцию signUp, не создавая каждый раз разные LiveData.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...