Модифицированный вызов не обновляет 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
переменная
Вы создаете новый user
LiveData
экземпляр в вызове ниже (отличается от того, который вы на самом деле наблюдаете в LoginActivity
,
public void onLoginClicked() {
user = loginRespository.doLogin(email.getValue(), password.getValue());
}