AndroidViewModel没有零参数构造函数 [英] AndroidViewModel has no zero argument constructor

查看:258
本文介绍了AndroidViewModel没有零参数构造函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

这是我的RecipeViewModel

  package com.example.kookrecepten;导入android.app.Application;导入androidx.lifecycle.AndroidViewModel;导入androidx.lifecycle.LiveData;导入java.util.List;公共类RecipeViewModel扩展了AndroidViewModel {私有RecipeRepository recipeRepository;私有LiveData< List< Recipe>allRecipes;公共RecipeViewModel(应用程序应用){超级(应用程序);recipeRepository =新的RecipeRepository(应用程序);allRecipes =配方Repository.getAllRecipes();}公共无效插入(食谱){recipeRepository.insert(recipe);}公共无效更新(食谱){recipeRepository.update(recipe);}公共无效删除(食谱){recipeRepository.delete(recipe);}公共无效deleteAll(){recipeRepository.deleteAllRecipes();}公共LiveData< List< Recipe>getAllRecipes(){返回allRecipes;}} 

现在纠正我,如果我错了,但是AndroidViewModel需要构造函数中的Application上下文,而ViewModel不需要.所以我不知道为什么Android要求一个零参数的构造函数.

这是我要求实例的主要活动.

  package com.example.kookrecepten;导入android.os.Bundle;导入android.view.View;导入android.widget.Toast;导入androidx.appcompat.app.AppCompatActivity;导入androidx.lifecycle.Observer;导入androidx.lifecycle.ViewModelProvider;导入com.example.kookrecepten.databinding.ActivityMainBinding;导入java.util.List;公共类MainActivity扩展了AppCompatActivity {私有ActivityMainBinding绑定;私有RecipeViewModel recipeViewModel;受保护的void onCreate(捆绑的saveInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);绑定= ActivityMainBinding.inflate(getLayoutInflater());视图view = binding.getRoot();setContentView(view);//获取RecipeViewModel的实例.recipeViewModel =新的ViewModelProvider(this).get(RecipeViewModel.class);recipeViewModel.getAllRecipes().observe(this,new Observer< List< Recipe>>(){@Overridepublic void onChanged(List< Recipe>食谱){//更新回收视图Toast.makeText(MainActivity.this,触发",Toast.LENGTH_SHORT).show();}});}} 

这是我的实现.

  def lifecycle_version ="2.2.0"def room_version ="2.2.5"//LifeCycle组件//ViewModel实现"androidx.lifecycle:lifecycle-viewmodel:$ lifecycle_version"//LiveData实现"androidx.lifecycle:lifecycle-livedata:$ lifecycle_version"//注释处理器实现"androidx.lifecycle:lifecycle-common-java8:$ lifecycle_version"//房间组件实现"androidx.room:房间运行时:$ room_version"注解处理器"androidx.room:room-compiler:$room_version" 

解决方案

如果您使用的是 hilt ,则可能忘记了使用 @AndroidEntryPoint 注释活动.>

I am trying to create an instance of my AndroidViewModel in MainActivity. When I do this I get the following error has no zero argument constructor

Here is my 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;
    }
}

Now correct me if I'm wrong but AndroidViewModel needs the Application context in the constructor and ViewModel doesn't. So I have no idea why android asks for a zero arguments constructor.

Here is my Main activity where I ask for an instance.

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();
            }
        });
    }
}

And this are my implementations.

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"

解决方案

if you're using hilt, you probably forgot to annotate your activity with @AndroidEntryPoint

这篇关于AndroidViewModel没有零参数构造函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆