我正在尝试在 MainActivity 中创建我的 AndroidViewModel 实例。当我这样做时,我得到以下错误没有零参数构造函数
这是我的 RecipeViewModel
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;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我错了,现在纠正我,但 AndroidViewModel …
java android android-lifecycle android-studio android-viewmodel
去年夏天,我开始使用 Android 的架构组件(Room、ViewModel、LiveData)重构我的 Android 应用程序。
我有两个 Room 存储库,其中一个由应用程序的多个视图(片段)访问。因此,我使用了AndroidViewModel,它可以访问此存储库并在我的MainActivity.
new ViewModelProvider(this).get(CanteensViewModel.class);
Run Code Online (Sandbox Code Playgroud)
在我的两个片段中,我通过
new ViewModelProvider(getActivity()).get(CanteensViewModel.class);
Run Code Online (Sandbox Code Playgroud)
直到昨天,这一切都完美无缺。但是后来我更新了我的依赖项,从androidx.lifecycle2.2.0 版开始这不再起作用了。我总是得到一个例外(siehe EDIT 2):
Caused by: java.lang.InstantiationException: java.lang.Class<com.(...).CanteensViewModel> has no zero argument constructor
Run Code Online (Sandbox Code Playgroud)
所以我检查了文档,正如我理解的那样,我现在应该/可以使用
ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication()).create(CanteensViewModel.class);
Run Code Online (Sandbox Code Playgroud)
获取我的 ViewModel。但是使用这种方法我无法添加owner( ViewModelProviders 构造函数的参数),这导致了问题,即我无法从片段内部真正访问我在 Activity 中创建的 ViewModel。
有没有办法可以从片段内部访问 Activity 的 ViewModel?或者最好通过以下方式在每个片段中重新创建ViewModel
ViewModelProvider.AndroidViewModelFactory.getInstance(getActivity().getApplication()).create(CanteensViewModel.class);
Run Code Online (Sandbox Code Playgroud)
而不是在活动中创建它?
编辑:
当我使用 的另一个构造函数时ViewModelProvider,它似乎有效,其中 aAndroidViewModelFactory是第二个参数。
new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication())).get(CanteensViewModel.class);
Run Code Online (Sandbox Code Playgroud)
在我的MainActivity我可以访问CanteensViewModel我的Fragment通过
new ViewModelProvider(requireActivity()).get(CanteensViewModel.class);
Run Code Online (Sandbox Code Playgroud)
针对上述异常编辑 2 Stacktrace: …
我需要使用一个AndroidViewModelwith 应用程序上下文和一个SavedStateHandle. 我已经将它与应用程序上下文一起使用了,但是我无法向SavedStateHandle它添加 a 。
这就是我所拥有的,只有应用程序上下文:
// A1. get ViewModel in Fragment
val viewModel = ViewModelProvider(viewLifecycleOwner).get(MyViewModel::class.java)
// A2. MyViewModel derives from my custom BaseAndroidViewModel
class MyViewModel(application: Application) :BaseAndroidViewModel(application)
// A3. BaseAndroidViewModel in turn derives from AndroidViewModel
open class BaseAndroidViewModel(application: Application) : AndroidViewModel(application)
Run Code Online (Sandbox Code Playgroud)
对于这个问题,我认为这可能会简化为:
// B1. get ViewModel in Fragment
val viewModel = ViewModelProvider(viewLifecycleOwner).get(MyViewModel::class.java)
// B2. BaseAndroidViewModel in turn derives from AndroidViewModel
class MyViewModel(application: Application) : AndroidViewModel(application)
Run Code Online (Sandbox Code Playgroud)
那么,对于还有一个SavedStateHandlein MyViewModel,我将如何修改片段中的调用(B1示例代码中的行)?我需要明确调用工厂SavedStateViewModelFactory …
android factory android-viewmodel android-architecture-components