Java AndroidViewModel没有零参数构造函数

Java AndroidViewModel没有零参数构造函数,java,android,android-studio,android-lifecycle,android-viewmodel,Java,Android,Android Studio,Android Lifecycle,Android Viewmodel,我正在尝试在MainActivity中创建AndroidViewModel的实例。当我这样做时,我得到以下错误没有零参数构造函数 这是我的收信人模型 package com.example.kookrecepten; import android.app.Application; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import java.util.List; pu

我正在尝试在MainActivity中创建AndroidViewModel的实例。当我这样做时,我得到以下错误没有零参数构造函数

这是我的收信人模型

package com.example.kookrecepten;

import android.app.Application;

import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;

import java.util.List;

public class RecipeViewModel extends AndroidViewModel {
    private RecipeRepository recipeRepository;
    private LiveData<List<Recipe>> allRecipes;

    public RecipeViewModel(Application application) {
        super(application);
        recipeRepository = new RecipeRepository(application);
        allRecipes = recipeRepository.getAllRecipes();
    }

    public void insert(Recipe recipe) {
        recipeRepository.insert(recipe);
    }

    public void update(Recipe recipe) {
        recipeRepository.update(recipe);
    }

    public void delete(Recipe recipe) {
        recipeRepository.delete(recipe);
    }

    public void deleteAll() {
        recipeRepository.deleteAllRecipes();
    }

    public LiveData<List<Recipe>> getAllRecipes() {
        return allRecipes;
    }
}
显然如果我改变

recipeViewModel = new ViewModelProvider(this).get(RecipeViewModel.class);
对此

recipeViewModel = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication())).get(RecipeViewModel.class);

它起作用了。我不知道这个解决方案为什么有效。有人能解释一下吗?

你能试一下旧的、不推荐的吗

recipeViewModel = ViewModelProviders.of(this).get(RecipeViewModel.class);

这肯定在我们的应用程序中起作用。如果您是冒险家类型,您还可以使用调试器并进入ViewModelProvider的get()方法,检查它如何尝试获取viewmodel的实例。

我查看了Android源代码。如果您的活动是扩展类
activity
,而不是
AppCompatActivity
,您就不会看到这个问题。类
活动
为接口
HasDefaultViewModelProviderFactory提供了一个实现,该接口为扩展AndroidViewModel的类提供了一个正确的工厂。不幸的是,
AppCompatActivity
仍然没有实现该接口,并且没有正确的工厂可用。因此,如果您使用的是
hilt
,您可能会忘记在几个小时后用
@AndroidEntryPoint

为您的活动添加注释,或者您可以自己实现接口
HasDefaultViewModelProviderFactory

,我收到了你的帖子,我意识到我忘了提到@AndroidEntryPoint。在我的例子中,我已经将@AndroidEntryPoint添加到我的基本活动中,它崩溃了,在每个活动中都设置了@AndroidEntryPoint。但是在我的dagger项目中,我只在BaseActivity上进行了AndroidInjection,我得到了相同的“没有零参数构造函数”错误,因为我没有在build.gradle中添加kapt'androidx.hilt:hilt编译器:1.0.0-alpha02'file@user34332002小时后,我来这里也是为了说同样的话,然后发现我之前忽略了你的评论……这是由activity ktx和lifecycle ktx之间的版本不匹配造成的。它使您的
AppCompatActivity
无法实现
HasDefaultViewModelProviderFactory
,这导致了这种奇怪的行为。您不需要手动获取“原始默认值”,因为这样您的默认值就不是
SavedStateViewModelFactory
@EpicPandaForce,因此,具体的解决方案是什么,因为我有相同的问题?我刚刚发现了ViewModel,我还不是大师;-)@gduh使用第一个版本,而不是第二个版本,但将您的AndroidX依赖项更新为最新版本-并显式添加AndroidX.fragment和AndroidX.activity以及AndroidX.core的最新非alpha版本,同时生命周期至少为2.2.0。@EpicPandaForce我已经检查了您的所有建议,但使用AndroidViewModel,应用程序仍然崩溃,并显示相同的消息“没有零参数构造函数”。目前,除了使用第二个解决方案外,我没有其他解决方案。@gduh请随意创建一个新问题,确保添加异常堆栈跟踪、ViewModel和build.gradle依赖项。同样重要的是要知道你是否在使用剑柄,因为这可能会因为缺少一些副剑柄而影响剑柄。确保你必须在活动中使用@AndroidEntryPoint
recipeViewModel = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication())).get(RecipeViewModel.class);
recipeViewModel = ViewModelProviders.of(this).get(RecipeViewModel.class);