come risolvere 'Impossibile creare un'istanza della classe ViewModel'?

ho provato le mani sull'architettura MVVM, ho implementato tutte le classi e i metodi richiesti. durante la creazione di un oggetto della classe ViewModel in MainActivity, ho ricevuto questo errore java.lang.RuntimeException: Cannot create an instance of class com.prathameshmore.getnotes.viewmodel.NoteViewModel.

ho provato questo esempio da un tutorial di YouTube. ho fatto tutta l'implementazione corretta. ho provato a fare classe ViewModel e costruttore pubblico, ma ancora, app crash a runtime.

MainActivity.java

'la classe pubblica MainActivity estende AppCompatActivity {

private NoteViewModel noteViewModel;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    noteViewModel = ViewModelProviders.of(this).get(NoteViewModel.class);
    noteViewModel.getAllNotes().observe(this, new Observer<List<Note>>() {
        @Override
        public void onChanged(List<Note> notes) {
            Toast.makeText(MainActivity.this, "Updated", Toast.LENGTH_SHORT).show();
        }
    });

}

} '}'

NoteViewModel.java

'la classe pubblica NoteViewModel estende AndroidViewModel {

private NoteRepository noteRepository;
private LiveData<List<Note>> allNotes;

public NoteViewModel(@NonNull Application application) {
    super(application);
    noteRepository = new NoteRepository(application);
    allNotes = noteRepository.getAllNotes();
}

public void insert(Note note) {
    noteRepository.insert(note);
}

public void update(Note note) {
    noteRepository.update(note);
}

public void delete(Note note) {
    noteRepository.delete(note);

}

public void deleteAllNotes() {
    noteRepository.deleteAllNotes();
}

public LiveData<List<Note>> getAllNotes() {
    return allNotes;
}

} '}'

NoteRepository.java

'classe pubblica NoteRepository {

private NoteDao noteDao;
private LiveData<List<Note>> allNotes;

public NoteRepository(Application application) {
    NoteDatabase database = NoteDatabase.getInstance(application);
    noteDao = database.noteDao();
    allNotes = noteDao.getAllNotes();
}

public void insert(Note note){
    new InsertNoteAsyncTask(noteDao).execute(note);
}

public void delete(Note note) {
    new DeleteNoteAsyncTask(noteDao).execute(note);
}

public void update(Note note) {
    new UpdateNoteAsyncTask(noteDao).execute(note);
}

public void deleteAllNotes() {
    new DeleteAllNotesAsyncTask(noteDao).execute();
}

public LiveData<List<Note>> getAllNotes() {
    return allNotes;
}

private static class InsertNoteAsyncTask extends AsyncTask<Note, Void, Void> {

    private NoteDao noteDao;

    private InsertNoteAsyncTask(NoteDao noteDao) {
        this.noteDao = noteDao;
    }

    @Override
    protected Void doInBackground(Note...notes) {
        noteDao.insert(notes[0]);
        return null;
    }
}

private static class UpdateNoteAsyncTask extends AsyncTask<Note, Void, Void> {

    private NoteDao noteDao;

    private UpdateNoteAsyncTask(NoteDao noteDao) {
        this.noteDao = noteDao;
    }

    @Override
    protected Void doInBackground(Note...notes) {
        noteDao.update(notes[0]);
        return null;
    }
}

private static class DeleteNoteAsyncTask extends AsyncTask<Note, Void, Void> {

    private NoteDao noteDao;

    private DeleteNoteAsyncTask(NoteDao noteDao) {
        this.noteDao = noteDao;
    }

    @Override
    protected Void doInBackground(Note...notes) {
        noteDao.delete(notes[0]);
        return null;
    }
}

private static class DeleteAllNotesAsyncTask extends AsyncTask<Void, Void, Void> {

    private NoteDao noteDao;

    private DeleteAllNotesAsyncTask(NoteDao noteDao) {
        this.noteDao = noteDao;
    }

    @Override
    protected Void doInBackground(Void...voids) {
        noteDao.deleteAllNotes();
        return null;
    }
}

} '}'

log log log

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.prathameshmore.getnotes, PID: 28833 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.prathameshmore.getnotes/com.prathameshmore.getnotes.views.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.prathameshmore.getnotes.viewmodel.NoteViewModel at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2723) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:163) at android.app.ActivityThread.main(ActivityThread.java:6238) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) Caused by: java.lang.RuntimeException: Cannot create an instance of class com.prathameshmore.getnotes.viewmodel.NoteViewModel at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:208) at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135) at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103) at com.prathameshmore.getnotes.views.MainActivity.onCreate(MainActivity.java:25) at android.app.Activity.performCreate(Activity.java:6868) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2676) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784)  at android.app.ActivityThread.-wrap12(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:163)  at android.app.ActivityThread.main(ActivityThread.java:6238)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)  Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance0(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:430) at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:200) at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135)  at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103)  at com.prathameshmore.getnotes.views.MainActivity.onCreate(MainActivity.java:25)  at android.app.Activity.performCreate(Activity.java:6868)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2676)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784)  at android.app.ActivityThread.-wrap12(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:163)  at android.app.ActivityThread.main(ActivityThread.java:6238)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)  Caused by: java.lang.RuntimeException: cannot find implementation for com.prathameshmore.getnotes.database.NoteDatabase. NoteDatabase_Impl does not exist at androidx.room.Room.getGeneratedImplementation(Room.java:94) at androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:851) at com.prathameshmore.getnotes.database.NoteDatabase.getInstance(NoteDatabase.java:31) at com.prathameshmore.getnotes.repository.NoteRepository.<init>(NoteRepository.java:20) at com.prathameshmore.getnotes.viewmodel.NoteViewModel.<init>(NoteViewModel.java:21) at java.lang.reflect.Constructor.newInstance0(Native Method)  at java.lang.reflect.Constructor.newInstance(Constructor.java:430)  at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:200)  at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135)  at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103)  at com.prathameshmore.getnotes.views.MainActivity.onCreate(MainActivity.java:25)  at android.app.Activity.performCreate(Activity.java:6868)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2676)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784)  at android.app.ActivityThread.-wrap12(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:163)  at android.app.ActivityThread.main(ActivityThread.java:6238)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)  Application terminated.


En title : How to fix 'Cannot create an instance of ViewModel class'?

5 Comments:

  1. dice che Caused by: java.lang.RuntimeException: cannot find implementation for com.prathameshmore.getnotes.database.NoteDatabase. NoteDatabase_Impl does not exist
  2. è necessario avere una classe di fabbrica per il vostro ViewModel.

    public class MyViewModelFactory implements ViewModelProvider.Factory {
        private Application mApplication;
        private String mParam;
    
    
        public MyViewModelFactory(Application application, String param) {
            mApplication = application;
            mParam = param;
        }
    
    
        @Override
        public <T extends ViewModel> T create(Class<T> modelClass) {
            return (T) new MyViewModel(mApplication, mParam);
        }
    }
    

    e quando instantiamo il modello di vista, ti piace questo:

    MyViewModel myViewModel = ViewModelProviders.of(this, new MyViewModelFactory(this.getApplication(), "my awesome param")).get(MyViewModel.class);
    
    1. il AndroidViewModelFactory che si ottiene per impostazione predefinita è sufficiente per un AndroidViewModel costruttore, non è necessario una fabbrica personalizzata per questo.

More similar articles:

  • non è possibile creare un'istanza della classe ViewModel (Impossibile avviare ComponentInfo attività)
  • come utilizzare un osservatore ViewModel & LiveData in molteplici attività?
  • come effettuare la chiamata di retrofit API utilizzando ViewModel e LiveData
  • il mio ViewModel sa della Vista, come posso risolvere questo problema?
  • vista vincolante al ViewModel in XAML genera errore "Impossibile creare un'istanza di"
  • come utilizzare la navigazione Android senza legarsi all'interfaccia utente in ViewModel (MVVM)?
  • come utilizzare l'iniezione di dipendenze per l'iniezione di un costruttore in un ViewModel
  • come posso usare app.fragment con LiveData e ViewModel
  • ViewModelProviders.of (FragmentActivity) .get (ViewModel:: class.java) che chiede attività invece di viewmodel in get () call
  • come inserire il pulsante in Griglia dalla classe C # ViewModel in windows 8.1 store app
  • come ereditare la classe ViewModel in UserControl?
  • componenti di Architettura Android: come è LiveData nel repository osservato da un ViewModel
  • ViewModel dietro la scena
  • finto ViewModel per test unità con Dagger2 (Robolectric)
  • come creare il ViewModel in MVVM per non violare il Principio di Responsabilità Unica?
  • Android MVVM ViewModel e Repository per ogni entità?
  • impostare la visibilità della barra di progressione da ViewModel prima e dopo il recupero dei dati dal servizio webservice
  • come portare un Comandamento WPF al ViewModel in MVVM?
  • come aggiungere un controllo utente ad una vista da una collezione in un ViewModel
  • AAC: come restituire il risultato (handle click) da ViewModel all'attività?
  • Android MVVM Qual è il modo giusto per impostare ViewModel per Fragment
  • come testare un ViewModel che viene caricato con uno BackgroundWorker?
  • come posso condividere lo stesso ViewModel tra due viste in WPF?
  • modifica della proprietà da ViewModel prima di essere associata a ListView
  • è possibile utilizzare ViewModel per inviare dati al server?
  • controllo della messa a fuoco da ViewModel
  • WPF Aggiunta al ViewModel e aggiornamento della vista
  • quali sono gli aspetti negativi dell'utilizzo di Riflessione per creare un comando Tipo generico nel mio ViewModel?
  • ListView.Selezionato il passaggio al ViewModel come parametro comando WindowsRT XAML
  • Xamarin: imposta labelText con un'istanza di ViewModel non aggiorna UI