Модифицированный вызов не обновляет viewmodel или viewmodel не обновляет представление

Я пытаюсь получить пользователя из API остальных для входа в систему в моем приложении Android для получения этого у меня есть следующий код

LoginActivity.java

public class LoginActivity extends AppCompatActivity {

    private   LoginViewModel loginViewModel;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ActivityLoginBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_login);
        loginViewModel = ViewModelProviders.of(this).get(LoginViewModel.class);
        binding.setLoginViewModel(loginViewModel);
        binding.setLifecycleOwner(this);

        loginViewModel.user.observe(this, new Observer<User>() {
            @Override
            public void onChanged(@Nullable User user) {
                Toast.makeText(getApplicationContext(), user.toString(), Toast.LENGTH_LONG).show();
            }
        });

    }
}

LoginViewModel.java

public class LoginViewModel extends ViewModel {

    private LoginRespository loginRespository = new LoginRespository();
    public MutableLiveData<User> user = new MutableLiveData<>();

    public MutableLiveData<String> email = new MutableLiveData<>();
    public MutableLiveData<String> password = new MutableLiveData<>();

    public LoginViewModel() {}

    public void onLoginClicked() {
        user = loginRespository.doLogin(email.getValue(), password.getValue());
    }

}

LoginRepository.java

@Singleton
public class LoginRespository {
    private APIInterface apiInterface;

    public LoginRespository(){
        this.apiInterface = APIClient.getClient().create(APIInterface.class);
    }

    //private final APIInterface apiInterface;
    /*@Inject
    public LoginRespository(APIInterface apiInterface) {
        this.apiInterface = apiInterface;
    }*/

    public MutableLiveData<User> doLogin(String email, String password) {
        final MutableLiveData<User> data = new MutableLiveData<>();

        Call<User> call = apiInterface.doGetLogin(email, password, APIClient.X_API_KEY, APIClient.X_CLIENT_ID);
        call.enqueue(new Callback<User>() {
            @Override
            public void onResponse(Call<User> call, Response<User> response) {
                User user = response.body();
                Log.d("#####0", user.toString());
                if (user.code.equals(APIClient.Codes.OK)){
                    Log.d("#####1", user.toString());
                    data.setValue(user);
                    Log.d("#####2", data.toString());
                }
            }

            @Override
            public void onFailure(Call<User> call, Throwable t) {
                call.cancel();
            }
        });

        return data;
    }
}

User.java

public class User{

    @SerializedName("code")
    @Expose
    public String code;
    @SerializedName("data")
    @Expose
    public List<Datum> data = null;
    @SerializedName("description")
    @Expose
    public String description;
    @SerializedName("datetime")
    @Expose
    public String datetime;

    /**
     * No args constructor for use in serialization
     *
     */
    public User() {
    }

    /**
     *
     * @param description
     * @param data
     * @param code
     * @param datetime
     */
    public User(String code, List<Datum> data, String description, String datetime) {
        super();
        this.code = code;
        this.data = data;
        this.description = description;
        this.datetime = datetime;
    }

    @Override
    public String toString() {
        return "User{" +
                "code='" + code + '\'' +
                ", data=" + data +
                ", description='" + description + '\'' +
                ", datetime='" + datetime + '\'' +
                '}';
    }
}

По моему мнению, у меня есть два EditText для входа в систему и работают отлично, потому что я могу передать электронную почту и пароль в LoginRepositori.doLogin и получить ответ от пользователя, но когда я хочу получить обновление о пользовательских данных в действии с loginViweMode.User.observe... Я никогда не получаю уведомления.

Тогда как это можно сделать, для этого будет вызываться loginViewModel.User.observe... в действии.

Благодарю.

2 ответа

Решение

Вам не хватает некоторых связей между активностью и моделью представления. Так как репозиторий каждый раз возвращает новый живой объект данных user не сможет наблюдать, так как его значение заменяется входящим вызовом.

Чтобы решить эту проблему, вы можете передать пользовательские данные в хранилище и обновить их значение из хранилища, создавая новый объект при каждом вызове.

или вы можете использовать функцию преобразования switchMap(), чтобы преобразовать результат в user переменная

Вы создаете новый userLiveData экземпляр в вызове ниже (отличается от того, который вы на самом деле наблюдаете в LoginActivity,

public void onLoginClicked() { 
    user = loginRespository.doLogin(email.getValue(), password.getValue());
} 
Другие вопросы по тегам