Resolving 'Cannot Create an Instance of Class ViewModel' in Android: The Importance of Public Constructors

Dec 03, 2025 · Programming · 19 views · 7.8

Keywords: Android | ViewModel | MVVM | Architecture Components

Abstract: This article discusses a common issue in Android development when using Architecture Components, where instantiating a ViewModel fails due to non-public constructors. It provides a detailed analysis and solutions, including making the constructor public and additional considerations for dependency injection with Hilt.

Introduction

In Android development, the ViewModel component from the Architecture Components library is crucial for managing UI-related data. However, developers often encounter the exception "Cannot create an instance of class ViewModel," which can halt the application's functionality.

Problem Analysis

The error typically occurs when the ViewModelProvider attempts to instantiate a ViewModel class. In the provided code snippet, the PostViewModel class has a default constructor without an explicit access modifier, making it package-private. This can prevent the framework from creating an instance, especially when the ViewModel is accessed from a different package or context.

Solution: Making the Constructor Public

The primary solution, as highlighted in the best answer, is to change the constructor to public. This ensures that the ViewModelProvider can invoke the constructor without access restrictions.

For example, modify the PostViewModel class as follows:

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

    public PostViewModel() { // Changed to public
        post = new MediatorLiveData<>();
        postRepo = new PostRepository();
    }

    // ... rest of the code
}

Additional Considerations

If you are using Hilt for dependency injection, ensure that your Activity or Fragment is annotated with @AndroidEntryPoint. This allows Hilt to properly inject dependencies and manage the ViewModel lifecycle.

Conclusion

By ensuring that ViewModel constructors are public, developers can avoid common instantiation errors and leverage the full benefits of Android Architecture Components. Always review access modifiers when defining ViewModel classes to prevent such issues.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.