1

I am trying to instantiate UserViewModel in my activity however it keeps giving me a java.lang.RuntimeException: Cannot create an instance of viewmodel class kindly assist.

This is how my ViewModel looks like

public class UserViewModel extends AndroidViewModel {

    private NodeAuthService api;
    private SharedPreferences pref;
    private static MutableLiveData<List<User>> userDetails = new MutableLiveData<>();

    public UserViewModel(@NonNull Application application) {
        super(application);
        api = AuthRetrofitClient.getInstance().create(NodeAuthService.class);
    }


    private String email = pref.getString("email", "");

    public void loadUser(){
        Call<List<User>> call;
        call = api.getUser(email);
        call.enqueue(new Callback<List<User>>() {
            @Override
            public void onResponse(Call<List<User>> call, Response<List<User>> response) {
                userDetails.postValue(response.body());

            }

            @Override
            public void onFailure(Call<List<User>> call, Throwable t) {
                Log.d("USER",t.getMessage());
            }
        });

    }

   public MutableLiveData<List<User>>getUserDetails(){
        return userDetails;
   }
}

This is how my activity is setup

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.navigation_drawer);
    String nameVm;

    userViewModel = ViewModelProviders.of(this).get(UserViewModel.class);

    userViewModel.loadUser();

    userViewModel.getUserDetails().observe(this, new Observer<List<User>>() {
        @Override
        public void onChanged(List<User> users) {
            if (users != null){
                for (int i = 0; i<users.size(); i++){
                    nameVm = String.valueOf(users.get(0));
                }
            }
        }
    });

}
1
  • Did you try by creating viewmodel factory Commented Oct 1, 2019 at 14:07

1 Answer 1

4

Create ViewModelFactory class

public class MyViewModelFactory implements ViewModelProvider.Factory {
    private Application mApplication;
    public MyViewModelFactory(Application application) {
        mApplication = application;           
    }

    @Override
    public <T extends ViewModel> T create(Class<T> modelClass) {
        // Replace UserViewModel →  with whatever or however you create your ViewModel
        return (T) new UserViewModel(mApplication);
    }
}

and init ViewModel like

UserViewModel myViewModel = ViewModelProviders.of(this, new MyViewModelFactory(this.getApplication())).get(UserViewModel.class);
Sign up to request clarification or add additional context in comments.

2 Comments

In the override method, the return statement, what does MyViewModel refer to
Sorry, that is your UserViewModel

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.