如何修复 Attempt to invoke virtual method on a null object reference 错误

How to fix Attempt to invoke virtual method on a null object reference error

我正在尝试使用 MVVM 架构创建登录屏幕并得到一个 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'androidx.lifecycle.MutableLiveData com.log.ui.login.LoginViewModel.getUser()'

请帮助查明此错误的原因。我认为问题与 Viewmodel 有关。对此有任何建议,我们将不胜感激。

我的登录片段代码

public class LoginScreen extends Fragment {


    private LoginViewModel loginViewModel;

   private FragmentLoginBinding binding;

   public View onCreateView(LayoutInflater inflater,
                            @Nullable ViewGroup container,
                            @Nullable Bundle savedInstanceState){

     //  binding=FragmentLoginBinding.inflate(getLayoutInflater(),container,false);
    binding= DataBindingUtil.inflate(inflater,R.layout.fragment_login,container,false);
       View view = binding.getRoot();


       binding.setLifecycleOwner(this);
       binding.setLoginViewModel(loginViewModel);
       //here data must be an instance of the class MarsDataProvider




 loginViewModel.getUser().observe(this,new Observer<Repository>(){

     public void onChanged(Repository loginUser) {

         if (TextUtils.isEmpty(Objects.requireNonNull(loginUser).getStrEmailAddress())) {
             binding.txtEmailAddress.setError("Enter an E-Mail Address");
             binding.txtEmailAddress.requestFocus();
         }
         else if (!loginUser.isEmailValid()) {
             binding.txtEmailAddress.setError("Enter a Valid E-mail Address");
             binding.txtEmailAddress.requestFocus();
         }
         else if (TextUtils.isEmpty(Objects.requireNonNull(loginUser).getStrPassword())) {
             binding.txtPassword.setError("Enter a Password");
             binding.txtPassword.requestFocus();
         }
         else if (!loginUser.isPasswordLengthGreaterThan5()) {
             binding.txtPassword.setError("Enter at least 6 Digit password");
             binding.txtPassword.requestFocus();
         }
         else {
             binding.lblEmailAnswer.setText(loginUser.getStrEmailAddress());
             binding.lblPasswordAnswer.setText(loginUser.getStrPassword());
         }

     }

       });

      // return binding.getRoot();
       return view;
   }
}

LoginViewModel.Java

public class LoginViewModel extends ViewModel {

    public MutableLiveData<String> EmailAddress = new MutableLiveData<>();
    public MutableLiveData<String> Password = new MutableLiveData<>();

    private MutableLiveData<Repository> userMutableLiveData;

    public MutableLiveData<Repository> getUser() {

        if (userMutableLiveData == null) {
            userMutableLiveData = new MutableLiveData<>();
        }
        return userMutableLiveData;

    }

    public void onClick(View view) {

        Repository loginUser = new Repository(EmailAddress.getValue(), Password.getValue());

        userMutableLiveData.setValue(loginUser);

    }

}

我的模型类可以在这里找到。

public class Repository {

    private String strEmailAddress;
    private String strPassword;

    public Repository(String EmailAddress, String Password) {
        strEmailAddress = EmailAddress;
        strPassword = Password;
    }

    public String getStrEmailAddress() {
        return strEmailAddress;
    }

    public String getStrPassword() {
        return strPassword;
    }

    public boolean isEmailValid() {
        return Patterns.EMAIL_ADDRESS.matcher(getStrEmailAddress()).matches();
    }


    public boolean isPasswordLengthGreaterThan5() {
        return getStrPassword().length() > 5;
    }

}

据我所知,您还没有初始化视图模型。在 setLoginViewModel

之前添加以下行
LoginViewModel loginViewModel = ViewModelProviders.of(getActivity()).get(LoginViewModel.class)