android - patterns - No se puede crear una instancia de la clase ViewModel
mvvm android (7)
Estoy tratando de escribir una aplicación de muestra con componentes de la arquitectura de Android y, incluso después de intentarlo durante días, no pude hacer que funcionara. Me da la excepción anterior.
Propietario del ciclo de vida: -
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;
}
}
- Principalmente, Solution está haciendo que Class y Constructor Public sean las otras respuestas.
- También puede ser un error de tiempo de ejecución, compruebe los registros de errores de Logcat si hay varias causas enumeradas.
Asegúrese de que su ViewModel
tenga un constructor con un solo parámetro, es decir, Application
.
ejemplo:
public YourViewModel(Application application) {
super(application);
...
Hacer pública la clase y el constructor resuelve mi problema.
Hay pocas razones para lanzar la excepción. He mencionado algunos de ellos.
- Asegúrate de que tu vista Modelo de clase sea pública
Asegúrate de que el constructor de tu modelo de vista sea público
Asegúrese de haber agregado la dependencia en su archivo grid para el ciclo de vida también si utiliza la sala y otras librerías que ha agregado.
- Si crea un objeto, cualquier otra clase dependiente en su constructor de clase de modelo de vista. Otra clase puede lanzar un error para crear la instancia de viewModel
Haz tu constructor public
.
No fue del todo obvio para mí, pero al obtener este error lo resolví creando un constructor público. Mi constructor se derivó de los ejemplos de desarrolladores de Android y contenía el Repositorio como un parámetro. La creación de un constructor adicional que estaba vacío sin parámetros y hacer que se resolviera el problema se solucionó.
es decir, en tu caso
public PostViewModel() {}
Si está utilizando Kotlin
asegúrese de reemplazar cualquier build.gradle
annotationProcessor
en build.gradle
con kapt
.
Me gusta:
annotationProcessor "android.arch.persistence.room:compiler:$rootProject.roomVersion"
Se convertirá
kapt "android.arch.persistence.room:compiler:$rootProject.roomVersion"
y añadir
apply plugin: ''kotlin-kapt''
encima del archivo buidl.gradle
.