96 votes

Impossible de créer une instance de la classe ViewModel

J'essaie d'écrire un exemple d'application à l'aide de composants d'architecture Android et même après avoir essayé pendant des jours, je n'ai pas pu 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;
    }
}
 

142voto

CommonsWare Points 402670

Faites votre constructeur public .

21voto

Max Points 6217

Si vous utilisez Kotlin assurez-vous de remplacer tout 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' au-dessus du fichier buidl.gradle .

Traitement des annotations avec Kotlin

19voto

vivek Points 525

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

exemple:

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

6voto

Brandon Points 16

Ce n'était pas complètement évident pour moi, mais en obtenant cette erreur, je l'ai résolue en créant un constructeur public. Mon constructeur était dérivé des exemples de développeur Android et contenait le référentiel en tant que paramètre. La création d'un constructeur supplémentaire vide sans paramètre et son affichage public ont résolu le problème.

c'est à dire dans votre cas

public PostViewModel() {}

5voto

RaghavPai Points 452

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X