我对LiveData有问题

活动内容:

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

        ActivityUserManagementBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_user_management);
        binding.setLoginObject(new LoginRequest());

        loginViewModel = new ViewModelProvider(this).get(LoginViewModel.class);
        binding.setLoginClickListener(loginViewModel);

        getLoginResponse();
    }

    private void getLoginResponse() {
        loginViewModel.getLoginViewModelListener().observe(this, new Observer<LoginResponse>() {
            @Override
            public void onChanged(LoginResponse loginResponse) {
                Log.e(TAG, "onChanged: " );
                if (loginResponse != null)
                    Toast.makeText(UserManagementActivity.this, loginResponse.msg, Toast.LENGTH_SHORT).show();
            }
        });
    }



仓库:

public class LoginRepository {

    private LoginRequest loginRequest;
    private MutableLiveData<LoginResponse> loginResponseLiveListener;

    public LoginRepository(LoginRequest loginRequest) {
        this.loginRequest = loginRequest;
        getLoginData();
    }

    public LiveData<LoginResponse> getLoginResponseLiveListener() {
        if(loginResponseLiveListener == null)
            loginResponseLiveListener = new MutableLiveData<>();
        Log.e(TAG, "getLoginResponseLiveListener: " );
        return loginResponseLiveListener;
    }

    private void getLoginData() {
        RetrofitClient.INSTANCE.callEndPoint().login(loginRequest).enqueue(new Callback<LoginResponse>() {
            @Override
            public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
                if(response.body() != null) {
                    loginResponseLiveListener.setValue(response.body());
                    Log.e(TAG, "onResponse: " + response.body().msg);
                }

            }

            @Override
            public void onFailure(Call<LoginResponse> call, Throwable t) {
                Log.e(TAG, "onFailure: "+ t.getMessage() );
            }
        });
    }
}


ViewModel:

public class LoginViewModel extends ViewModel {

    private boolean isValid = true;
    private LoginRepository loginRepository;
    private MutableLiveData<LoginResponse> loginViewModelListener;

    public void onSubmitLoginClicked(View submit, CustomEditText email, CustomEditText password, LoginRequest loginRequest) {
        if (loginValidation(email, password, loginRequest)) {
            loginRequest.setToken(MyTools.getKey(MyApplication.getApplication(), "token"));
            loginRepository = new LoginRepository(loginRequest);

            loginViewModelListener.setValue(loginRepository.getLoginResponseLiveListener().getValue());
        }
    }

    public MutableLiveData<LoginResponse> getLoginViewModelListener(){
        return loginViewModelListener;
    }

    private boolean loginValidation(CustomEditText email, CustomEditText password, LoginRequest loginRequest) {
        if (UserValidation.isNullOrEmpty(loginRequest.email) ||!UserValidation.isEmail(loginRequest.email)) {
            email.setError(MyApplication.getApplication().getString(R.string.error_login_email));
            isValid = false;
        }

        if (UserValidation.isNullOrEmpty(loginRequest.password) ) {
            password.setError(MyApplication.getApplication().getString(R.string.error_login_password));
            isValid = false;
        }

        return isValid;
    }
}


我没有从活动中得到任何东西,因为返回的livedata对象为null!
那么问题出在哪里呢?
这是干净的代码吗?我将视图从xml传递到视图模型,以使视图模型具有所有逻辑。
请我需要您的帮助和您的建议。

最佳答案

仅当有活动的观察者时,LiveData才会发出值。当您拨打此行

loginViewModelListener.setValue(loginRepository.getLoginResponseLiveListener().getValue());


loginRepository中liveData的值为null,因此viewModel中的liveData发出null,并且viewModel不知道存储库中以后更改的更新值。

我认为您想观察从logModel到loginRepository的liveData的变化,然后将值重新发送给活动/分段中的观察者。如果是这样,则需要使用Transformations。他们观察变化,应用转换并发出新值。

在这种情况下,如果不需要对发射值进行任何修改,则可以这样更改:

private MutableLiveData<LoginResponse> loginViewModelListener;
public LoginViewModel(){
     loginViewModelListener = Transformation.map(loginRepository.getLoginResponseLiveListener(),result->result);

}

关于java - 使用MVVM和LiveData登录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61849148/

10-13 09:14