如何修复“无法创建 ViewModel 类的实例”?

Posted

技术标签:

【中文标题】如何修复“无法创建 ViewModel 类的实例”?【英文标题】:How to fix 'Cannot create an instance of ViewModel class'? 【发布时间】:2019-10-18 02:38:42 【问题描述】:

我尝试了 MVVM 架构,我实现了所有必需的类和方法。在 MainActivity 中创建 ViewModel 类的对象时,出现此错误java.lang.RuntimeException: Cannot create an instance of class com.prathameshmore.getnotes.viewmodel.NoteViewModel

我在 YouTube 教程中尝试了这个示例。我做了所有正确的实现。我尝试将 ViewModel 类和构造函数公开,但应用程序在运行时仍然崩溃。

MainActivity.java

public class MainActivity extends 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

public class NoteViewModel extends 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

public class 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;
    




日志

E/AndroidRuntime: 致命异常: main 进程:com.prathameshmore.getnotes,PID:28833 java.lang.RuntimeException:无法启动活动 ComponentInfocom.prathameshmore.getnotes/com.prathameshmore.getnotes.views.MainActivity: java.lang.RuntimeException:无法创建类的实例 com.prathameshmore.getnotes.viewmodel.NoteViewModel 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2723) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:163) 在 android.app.ActivityThread.main(ActivityThread.java:6238) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 原因:java.lang.RuntimeException:无法创建类 com.prathameshmore.getnotes.viewmodel.NoteViewModel 的实例 在 androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:208) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103) 在 com.prathameshmore.getnotes.views.MainActivity.onCreate(MainActivity.java:25) 在 android.app.Activity.performCreate(Activity.java:6868) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2676) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:163) 在 android.app.ActivityThread.main(ActivityThread.java:6238) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 引起:java.lang.reflect.InvocationTargetException 在 java.lang.reflect.Constructor.newInstance0(本机方法) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:430) 在 androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:200) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103) 在 com.prathameshmore.getnotes.views.MainActivity.onCreate(MainActivity.java:25) 在 android.app.Activity.performCreate(Activity.java:6868) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2676) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:163) 在 android.app.ActivityThread.main(ActivityThread.java:6238) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 原因:java.lang.RuntimeException:找不到 com.prathameshmore.getnotes.database.NoteDatabase 的实现。 注意Database_Impl 不存在 在 androidx.room.Room.getGeneratedImplementation(Room.java:94) 在 androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:851) 在 com.prathameshmore.getnotes.database.NoteDatabase.getInstance(NoteDatabase.java:31) 在 com.prathameshmore.getnotes.repository.NoteRepository.(NoteRepository.java:20) 在 com.prathameshmore.getnotes.viewmodel.NoteViewModel.(NoteViewModel.java:21) 在 java.lang.reflect.Constructor.newInstance0(本机方法) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:430) 在 androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:200) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103) 在 com.prathameshmore.getnotes.views.MainActivity.onCreate(MainActivity.java:25) 在 android.app.Activity.performCreate(Activity.java:6868) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2676) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:163) 在 android.app.ActivityThread.main(ActivityThread.java:6238) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 在 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 【参考方案1】:

您需要为您的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);
    

当实例化视图模型时,你会这样做:

MyViewModel myViewModel = ViewModelProviders.of(this, new MyViewModelFactory(this.getApplication(), "my awesome param")).get(MyViewModel.class);

【讨论】:

你默认得到的AndroidViewModelFactory对于AndroidViewModel构造函数来说已经足够了,你不需要一个自定义工厂。 所以我不需要创建ViewModelFactory ViewModel 使用 Android KTX 而不是工厂【参考方案2】:

这样可以正常工作:

1.转到您的 build.gradle(Module:app) 并将其添加到依赖项中:

`implementation "android.arch.lifecycle:extensions:$lifecycle_version"`  

确保在您的依赖项中包含 def lifecycle_version = "2.2.0"。 所以它应该是这样的:

dependencies 

    def lifecycle_version = "2.2.0"  //make sure to have this 

    //Some implementations ...  

    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'


    implementation "android.arch.lifecycle:extensions:$lifecycle_version" // make sure to have this too.

  

2.转到您的活动(在您的情况下是MainActivity)并输入以下行:

noteViewModel = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication())).get(NoteViewModel.class);  

所以你的MainActivity.java 应该是这样的:

public class MainActivity extends AppCompatActivity 

private NoteViewModel noteViewModel;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    noteViewModel = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication())).get(NoteViewModel.class);
    noteViewModel.getAllNotes().observe(this, new Observer<List<Note>>() 
        @Override
        public void onChanged(List<Note> notes) 
            Toast.makeText(MainActivity.this, "Update, Enjoy coding :)", Toast.LENGTH_SHORT).show();
        
    );



3.运行您的应用程序。

【讨论】:

【参考方案3】:

放这个

noteViewModel = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication())).get(NoteViewModel.class);

而不是

new ViewModelProvider(this).get(mainActivityViewModel.class);

【讨论】:

【参考方案4】:

考虑到 CBS 的回答与 2.3.0-alpha01 更新 lifecycle-extensions 工件不再发布。

Lifecycle Documentation

依赖关系

def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
kapt "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"

implementation "androidx.fragment:fragment-ktx:1.2.4"

AndroidViewModel 类

class TestVM (app : android.app.Application) : AndroidViewModel(app)
    //Code

在片段中

override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    val viewModel = ViewModelProvider(this).get(TestVM::class.java)

【讨论】:

以上是关于如何修复“无法创建 ViewModel 类的实例”?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 npm 审计修复问题?

如何修复drv?

如何修复漏洞

如何修复WMI

PHP网站漏洞怎么修复 如何修补网站程序代码漏洞

如何修复这些漏洞? (npm audit fix 无法修复这些漏洞)