相关疑难解决方法(0)

AndroidViewModel 没有零参数构造函数

我正在尝试在 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

12
推荐指数
2
解决办法
8170
查看次数

可以通过 Fragment 访问 Activity 的 AndroidViewModel 吗?

去年夏天,我开始使用 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: …

android viewmodel android-architecture-components

8
推荐指数
1
解决办法
6295
查看次数

带有 SavedState 的 AndroidViewModel

我需要使用一个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

7
推荐指数
1
解决办法
2040
查看次数