Cannot create an instance of class ViewModel

2019-04-03 08:26发布

问题:

I am trying to write a sample app using Android architecture components and but even after trying for days I could not get it to work. It gives me the above exception.

Lifecycle owner:-

public class MainActivity extends LifecycleActivity {

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView = findViewById(R.id.tv_user);
        PostViewModel viewModel = ViewModelProviders.of(this).get(PostViewModel.class);
        viewModel.loadPosts();
        viewModel.getPost().observe(this, new Observer<Post>() {
            @Override
            public void onChanged(@Nullable Post post) {
                if(post != null) {
                    textView.setText(post.toString());
                }
            }
        });
    }
}

ViewModel:-

public class PostViewModel extends ViewModel {
    private MediatorLiveData<Post> post;
    private PostRepository postRepo;

    PostViewModel() {
        post = new MediatorLiveData<>();
        postRepo = new PostRepository();
    }

    public LiveData<Post> loadPosts() {
        post.addSource(postRepo.getPost(),
                post -> this.post.setValue(post)
        );
        return post;
    }

    @NonNull
    public LiveData<Post> getPost() {
        return post;
    }
}

回答1:

Make your constructor public.



回答2:

Make sure your ViewModel has constructor with only one parameter i.e. Application.

example:

public YourViewModel(Application application) {
    super(application);
    ...


回答3:

It was not completely obvious to me, but when getting this error I resolved it by creating a public constructor. My constructor was derived from the Android Developer examples and contained the Repository as a parameter. Creating an additional constructor that was empty with no params and having it public solved the issue.

i.e., in your case

public PostViewModel() {}



回答4:

If you are using Kotlin make sure to replace any annotationProcessor in build.gradle with kapt.

Like:

annotationProcessor "android.arch.persistence.room:compiler:$rootProject.roomVersion"

Will become

kapt "android.arch.persistence.room:compiler:$rootProject.roomVersion"

and add

apply plugin: 'kotlin-kapt' on top of the buidl.gradle file.

Annotation Processing with Kotlin



回答5:

Make the class and constructor public it solved my problem .



回答6:

There are few reason to throw the exception . I have mention some of them..

  1. Make sure your view Model class is public
  2. Make sure your view model class constructor is public

  3. Make sure you have added the dependency in your gridle file for lifecycle also if you use room and other libries you have added ..

  4. if you create object any other dependent class in your view model class constructor . Other class can throw error to create the instance of viewModel


回答7:

  1. Mostly, Solution is making Class and Constructor Public as the other answers
  2. It may also be a runtime error, check the Logcat Error Logs if there are multiple causes listed.


回答8:

I got this after migrating to AndroidX.

There's a bug in androidx.lifecycle:lifecycle-viewmodel:2.0.0-beta01 where Proguard removes the constructor.

https://issuetracker.google.com/issues/112230489

Fix by upgrading to 2.0.0, and remember to update your proguard rules if needed.

My error message looked like this:

java.lang.RuntimeException: Cannot create an instance of class my.custom.viewmodel.CustomViewModel
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:202)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103)
......
Caused by: java.lang.NoSuchMethodException: <init> [class android.app.Application]
at java.lang.Class.getConstructor0(Class.java:2204)
at java.lang.Class.getConstructor(Class.java:1683)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:200)
... 34 more


  androidx.test.espresso.PerformException: Error performing 'single click - At Coordinates: 539, 1167 and precision: 16, 16' on view 'with id: my.test:id/button_return_to_main_menu'.
at androidx.test.espresso.PerformException$Builder.build(PerformException.java:82)
at androidx.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:79)
.....
Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{my.custom.domain.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class my.custom.viewmodel.CustomViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)