web-dev-qa-db-fra.com

Impossible de créer une instance de la classe ViewModel

J'essaie d'écrire un exemple d'application en utilisant des composants d'architecture Android et même après plusieurs jours d'essais, je ne pouvais pas le faire fonctionner. Cela me donne l'exception ci-dessus.

Propriétaire du cycle de vie: -

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;
    }
}
20
Parag Kadam

Faites votre constructeur public.

43
CommonsWare

Assurez-vous que votre ViewModel a un constructeur avec un seul paramètre, c'est-à-dire Application.

exemple:

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

Si vous utilisez Kotlin, veillez à remplacer annotationProcessor dans build.gradle par kapt.

Comme:

annotationProcessor "Android.Arch.persistence.room:compiler:$rootProject.roomVersion"

Va devenir

kapt "Android.Arch.persistence.room:compiler:$rootProject.roomVersion"

et ajouter 

apply plugin: 'kotlin-kapt' en haut du fichier buidl.gradle.

Traitement des annotations avec Kotlin

3
Max

Rendez la classe et le constructeur publics, cela a résolu mon problème.

2
RaghavPai
  1. La plupart du temps, Solution rend les classes et constructeurs publics, les autres réponses
  2. Il peut également s'agir d'une erreur d'exécution. Consultez les journaux des erreurs Logcat si plusieurs causes sont répertoriées.
0
lomec

Il y a peu de raisons de lancer l'exception. J'en ai mentionné quelques-uns ..

  1. Assurez-vous que votre vue Model est publique
  2. Assurez-vous que le constructeur de la classe de votre modèle de vue est public.

  3. Assurez-vous que vous avez ajouté la dépendance dans votre fichier gridle pour cycle de vie aussi si vous utilisez room et autres bibliothèques que vous avez ajoutées.

  4. si vous créez un objet, une autre classe dépendante dans votre constructeur de modèle de vue class. Une autre classe peut générer une erreur en créant l’instance De viewModel
0
Hoque MD Zahidul