Java AndroidViewModel没有零参数构造函数
我正在尝试在MainActivity中创建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
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);