AndroidViewModel 没有零参数构造函数
AndroidViewModel has no zero argument constructor
我正在尝试在 MainActivity 中创建我的 AndroidViewModel 实例。当我这样做时,出现以下错误 has no zero argument constructor
这是我的 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;
}
}
现在如果我错了请纠正我,但 AndroidViewModel 需要构造函数中的应用程序上下文,而 ViewModel 不需要。所以我不知道为什么 android 要求零参数构造函数。
这是我的 Main activity 请求实例的地方。
package com.example.kookrecepten;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import com.example.kookrecepten.databinding.ActivityMainBinding;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
private RecipeViewModel recipeViewModel;
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
binding = ActivityMainBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
//Get an instance of the RecipeViewModel.
recipeViewModel = new ViewModelProvider(this).get(RecipeViewModel.class);
recipeViewModel.getAllRecipes().observe(this, new Observer<List<Recipe>>() {
@Override
public void onChanged(List<Recipe> recipes) {
//Update recycle view
Toast.makeText(MainActivity.this, "triggered", Toast.LENGTH_SHORT).show();
}
});
}
}
这是我的实现。
def lifecycle_version = "2.2.0"
def room_version = "2.2.5"
//LifeCycle Components
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
// Annotation processor
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
//Room Components
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
显然如果我改变
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() 方法来检查它如何尝试获取视图模型的实例。
我查看了 Android 源代码。如果您的 activity 扩展的是 class Activity
,而不是 AppCompatActivity
,您就不会看到此问题。 class Activity
为接口 HasDefaultViewModelProviderFactory
提供了一个实现,它为 classes 扩展 AndroidViewModel 提供了一个正确的工厂。不幸的是,AppCompatActivity
仍然没有实现该接口,因此没有正确的工厂可用。所以,要么你像你一样提供工厂,要么你自己实现接口 HasDefaultViewModelProviderFactory
.
如果您正在使用 hilt
,您可能忘记了用 @AndroidEntryPoint
注释您的 activity
我正在尝试在 MainActivity 中创建我的 AndroidViewModel 实例。当我这样做时,出现以下错误 has no zero argument constructor
这是我的 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;
}
}
现在如果我错了请纠正我,但 AndroidViewModel 需要构造函数中的应用程序上下文,而 ViewModel 不需要。所以我不知道为什么 android 要求零参数构造函数。
这是我的 Main activity 请求实例的地方。
package com.example.kookrecepten;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import com.example.kookrecepten.databinding.ActivityMainBinding;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
private RecipeViewModel recipeViewModel;
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
binding = ActivityMainBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
//Get an instance of the RecipeViewModel.
recipeViewModel = new ViewModelProvider(this).get(RecipeViewModel.class);
recipeViewModel.getAllRecipes().observe(this, new Observer<List<Recipe>>() {
@Override
public void onChanged(List<Recipe> recipes) {
//Update recycle view
Toast.makeText(MainActivity.this, "triggered", Toast.LENGTH_SHORT).show();
}
});
}
}
这是我的实现。
def lifecycle_version = "2.2.0"
def room_version = "2.2.5"
//LifeCycle Components
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
// Annotation processor
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
//Room Components
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
显然如果我改变
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() 方法来检查它如何尝试获取视图模型的实例。
我查看了 Android 源代码。如果您的 activity 扩展的是 class Activity
,而不是 AppCompatActivity
,您就不会看到此问题。 class Activity
为接口 HasDefaultViewModelProviderFactory
提供了一个实现,它为 classes 扩展 AndroidViewModel 提供了一个正确的工厂。不幸的是,AppCompatActivity
仍然没有实现该接口,因此没有正确的工厂可用。所以,要么你像你一样提供工厂,要么你自己实现接口 HasDefaultViewModelProviderFactory
.
如果您正在使用 hilt
,您可能忘记了用 @AndroidEntryPoint