无法创建ViewModel类的实例

问题描述 投票:22回答:11

我正在尝试使用Android架构组件编写示例应用程序,但即使在尝试了几天之后我也无法使用它。它给了我以上例外。

生命周期所有者: -

public class MainActivity extends LifecycleActivity {

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView = findViewById(R.id.tv_user);
        PostViewModel viewModel = ViewModelProviders.of(this).get(PostViewModel.class);
        viewModel.loadPosts();
        viewModel.getPost().observe(this, new Observer<Post>() {
            @Override
            public void onChanged(@Nullable Post post) {
                if(post != null) {
                    textView.setText(post.toString());
                }
            }
        });
    }
}

视图模型: -

public class PostViewModel extends ViewModel {
    private MediatorLiveData<Post> post;
    private PostRepository postRepo;

    PostViewModel() {
        post = new MediatorLiveData<>();
        postRepo = new PostRepository();
    }

    public LiveData<Post> loadPosts() {
        post.addSource(postRepo.getPost(),
                post -> this.post.setValue(post)
        );
        return post;
    }

    @NonNull
    public LiveData<Post> getPost() {
        return post;
    }
}
android mvvm android-architecture-components
11个回答
59
投票

让你的构造函数public


0
投票

如果您在活动中使用了viewmodel,请检查您的活动是否扩展了“DaggerAppCompatActivity”

例如

public class UserComments extends AppCompatActivity 

将此更改为

public class UserComments extends DaggerAppCompatActivity

0
投票

我正在使用这个示例android-arcuitecture-component BasicSample创建一个新项目,面对类似的错误日志,发现我没有更改de applicatio name

AndroidManifest.xml中

这是我的错误,修复将aplicacion名称放到de BasicApp,这个类是在示例中实现的。

...
<application
    android:name=".BasicApp"
    android:allowBackup="false"

0
投票

如果您的PostViewModel类是内部类,请确保它是public和static


9
投票

确保你的ViewModel只有一个参数,即Application构造函数。

例:

public YourViewModel(Application application) {
    super(application);
    ...

5
投票

如果你正在使用Kotlin,请确保用annotationProcessor替换build.gradle中的任何kapt

喜欢:

annotationProcessor "android.arch.persistence.room:compiler:$rootProject.roomVersion"

会变成

kapt "android.arch.persistence.room:compiler:$rootProject.roomVersion"

并添加

apply plugin: 'kotlin-kapt'buidl.gradle文件之上。

Annotation Processing with Kotlin


4
投票

这对我来说并不是很明显,但是当得到这个错误时,我通过创建一个公共构造函数来解决它。我的构造函数源自Android Developer示例,并包含Repository作为参数。创建一个空的没有参数并使其公开的其他构造函数解决了这个问题。

即,在你的情况下

public PostViewModel() {}


3
投票

使类和构造函数公开它解决了我的问题。


2
投票

没有理由抛出异常。我提到了其中的一些......

  1. 确保您的视图Model类是公共的
  2. 确保您的视图模型类构造函数是公共的
  3. 如果您使用了已添加的房间和其他库,请确保在生命周期的gridle文件中添加了依赖项。
  4. 如果在视图模型类构造函数中创建任何其他依赖类的对象。其他类可以抛出错误来创建viewModel的实例

1
投票

迁移到AndroidX后我得到了这个。

androidx.lifecycle:lifecycle-viewmodel:2.0.0-beta01中有一个错误,其中Proguard删除了构造函数。

https://issuetracker.google.com/issues/112230489

通过升级到2.0.0进行修复,并记住在需要时更新您的proguard规则。

我的错误消息如下所示:

java.lang.RuntimeException: Cannot create an instance of class my.custom.viewmodel.CustomViewModel
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:202)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103)
......
Caused by: java.lang.NoSuchMethodException: <init> [class android.app.Application]
at java.lang.Class.getConstructor0(Class.java:2204)
at java.lang.Class.getConstructor(Class.java:1683)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:200)
... 34 more


  androidx.test.espresso.PerformException: Error performing 'single click - At Coordinates: 539, 1167 and precision: 16, 16' on view 'with id: my.test:id/button_return_to_main_menu'.
at androidx.test.espresso.PerformException$Builder.build(PerformException.java:82)
at androidx.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:79)
.....
Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{my.custom.domain.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class my.custom.viewmodel.CustomViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)

1
投票

从ViewModel类扩展AndroidViewModel。

public class YourViewModel extends AndroidViewModel {

    public YourViewModel(Application application) {
        super(application);

        //Todo: ...
    }

}

0
投票
  1. 大多数情况下,解决方案是将Class和Constructor Public作为其他答案
  2. 它也可能是运行时错误,如果列出了多个原因,请检查Logcat错误日志。
© www.soinside.com 2019 - 2024. All rights reserved.