Невозможно создать экземпляр класса ViewModel

Я пытаюсь написать пример приложения с использованием компонентов архитектуры Android, но даже после нескольких дней работы я не мог заставить его работать. Это дает мне вышеизложенное исключение.

Владелец жизненного цикла: -

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

Создайте свой конструктор public.

Ответ 2

Убедитесь, что ваш ViewModel имеет конструктор только с одним параметром, то есть с Application.

пример:

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

Ответ 3

Если вы используете Kotlin обязательно замените любой annotationProcessor в build.gradle на kapt.

Подобно:

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

Станет

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

и добавить

apply plugin: 'kotlin-kapt' поверх файла buidl.gradle.

Обработка аннотаций с помощью Kotlin

Ответ 4

Это было не совсем очевидно для меня, но при получении этой ошибки я решил это, создав публичный конструктор. Мой конструктор был получен из примеров Android Developer и содержал репозиторий в качестве параметра. Создание дополнительного конструктора, который был пуст без каких-либо параметров и публично решил проблему.

i.e., в вашем случае

public PostViewModel() {}

Ответ 5

Сделать класс и конструктор общедоступными, он решил мою проблему.

Ответ 6

Есть несколько причин, чтобы бросить исключение. Я упомянул некоторые из них..

  1. Убедитесь, что ваш вид Модель класса общедоступна
  2. Убедитесь, что ваш конструктор класса модели представления является общедоступным

  3. Убедитесь, что вы добавили зависимость в свой файл gridle для жизненного цикла, даже если вы используете комнату и другие библиотеки, которые вы добавили.

  4. если вы создаете объект любого другого зависимого класса в конструкторе класса модели представления. Другой класс может выдать ошибку для создания экземпляра viewModel

Ответ 7

  1. В основном, Solution делает класс и конструктор общедоступными, как и другие ответы.
  2. Это также может быть ошибка во время выполнения, проверьте журналы ошибок Logcat, если есть несколько причин в списке.

Ответ 8

Если вы использовали viewmodel внутри своей активности, убедитесь, что ваша активность расширяет "DaggerAppCompatActivity" или нет

Например

public class UserComments extends AppCompatActivity 

изменить это на

public class UserComments extends DaggerAppCompatActivity

Ответ 9

Я получил это после перехода на AndroidX.

В androidx.lifecycle:lifecycle-viewmodel:2.0.0-beta01 есть ошибка androidx.lifecycle:lifecycle-viewmodel:2.0.0-beta01 которой Proguard удаляет конструктор.

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

Исправьте путем обновления до 2.0.0, и не забудьте обновить правила Proguard, если это необходимо.

Мое сообщение об ошибке выглядело так:

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)

Ответ 10

Расширьте AndroidViewModel из вашего класса ViewModel.

public class YourViewModel extends AndroidViewModel {

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

        //Todo: ...
    }

}

Ответ 11

если ваш класс PostViewModel является внутренним классом, убедитесь, что он открытый и статический

Ответ 12

Сделайте свой класс и конструктор общедоступными.

Ответ 13

Я использую этот пример Android-arcuitecture-component BasicSample, чтобы создать новый проект с аналогичным журналом ошибок и обнаружил, что я не изменил имя приложения.

AndroidManifest.xml

и это была моя ошибка, чтобы исправить, поставьте имя aplicacion в de BasicApp, этот класс реализован в примере.

...
<application
    android:name=".BasicApp"
    android:allowBackup="false"

Ответ 14

В моем случае мне нужно было использовать ListItemViewModelFactory для передачи параметра в мою модель представления.

Ответ 15

Создание дополнительного конструктора, который был пустым без параметров и общедоступным, решил проблему.