首页 > 解决方案 > AndroidViewModel 没有零参数构造函数。如何解决这个问题?

问题描述

我几乎在整个互联网上搜索了我的问题,但找不到我需要的答案。是的。我的问题不是唯一的,但没有答案,这可以帮助我。所以我决定自己问。

现在关于问题:

public class AuthActivityViewModel extends AndroidViewModel {

    Repository repository;
    private LiveData<List<User>> users;
    private LiveData<User> user;

    public AuthActivityViewModel(@NonNull Application application) {
        super(application);

        repository = new Repository(application);
    }

    public LiveData<List<User>> getUsers() {
        users = repository.getUsers();
        return users;
    }

    public LiveData<User> getUser(int userId) {
        user = repository.getUser(userId);
        return user;
    }

    public void addNewUser(User user) {
        repository.insertUser(user);
    }

    public void updateUser(User user) {
        repository.updateUser(user);
    }

    public void deleteUser(User user) {
        repository.deleteUser(user);
    }
}

..................................................

public class AuthActivity extends AppCompatActivity implements AuthInteractionListener {

    private FragmentManager fragmentManager;
    private final ConnectionBroadcastReceiver connectionBroadcastReceiver = new ConnectionBroadcastReceiver();

    private int limitOfOnWindowFocusChangedOperationForAuthActivity = 0;
    private boolean isActivityRecreated;

    AuthActivityViewModel authActivityViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_auth);

        isActivityRecreated = true;
        IntentFilter connectionIntentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(connectionBroadcastReceiver, connectionIntentFilter);

        authActivityViewModel = new ViewModelProvider(this).get(AuthActivityViewModel.class);
    }
    ...
}

......

错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.findthepikachuupgradeversion2/com.example.android.findthepikachuupgradeversion3.view.AuthActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.android.findthepikachuupgradeversion3.viewmodel.AuthActivityViewModel
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3307)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3446)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2043)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:224)
    at android.app.ActivityThread.main(ActivityThread.java:7548)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
 Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.android.findthepikachuupgradeversion3.viewmodel.AuthActivityViewModel
    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
    at com.example.android.findthepikachuupgradeversion3.view.AuthActivity.onCreate(AuthActivity.java:44)
    at android.app.Activity.performCreate(Activity.java:7893)
    at android.app.Activity.performCreate(Activity.java:7880)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3282)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3446) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2043) 
    at android.os.Handler.dispatchMessage(Handler.java:107) 
    at android.os.Looper.loop(Looper.java:224) 
    at android.app.ActivityThread.main(ActivityThread.java:7548) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) 
 Caused by: java.lang.InstantiationException: java.lang.Class<com.example.android.findthepikachuupgradeversion3.viewmodel.AuthActivityViewModel> has no zero argument constructor
    at java.lang.Class.newInstance(Native Method)
    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:219)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187) 
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150) 
    at com.example.android.findthepikachuupgradeversion3.view.AuthActivity.onCreate(AuthActivity.java:44) 
    at android.app.Activity.performCreate(Activity.java:7893) 
    at android.app.Activity.performCreate(Activity.java:7880) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3282) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3446) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2043) 
    at android.os.Handler.dispatchMessage(Handler.java:107) 
    at android.os.Looper.loop(Looper.java:224) 
    at android.app.ActivityThread.main(ActivityThread.java:7548) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) 
  1. 我试图在类 AuthActivityViewModel 中添加一个没有参数的构造函数,但是得到了这个错误

androidx.lifecycle.AndroidViewModel 中没有可用的默认构造函数

  1. 建议如

    不是实际的。为什么?因为他们已经是他们应该的样子了,但我有一个不应该的错误。既然问题存在,肯定是有什么我没有算进去的。

这是 gradle 文件的一部分:

def生命周期版本=“2.2.0”实现“androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version”

implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
def room_version = "2.2.5"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"

我怎么解决这个问题?

标签: javaandroidviewmodel

解决方案


将以下依赖项添加到 gradle app 模块级别。

implementation 'androidx.lifecycle:lifecycle-extensions:$lifecycle_version

扩展包括许多库,包括LiveData, 所以,通过添加它,您可以摆脱:

implementation 'androidx.lifecycle:lifecycle-livedata:$lifecycle_version

但似乎生命周期扩展已被弃用。是否存在解决此问题的另一个依赖项?

没错,从 version:2.2.0 开始,它已被弃用

生命周期扩展工件弃用:由于上述 ViewModelProviders.of() 的弃用,此版本标志着生命周期扩展中最后一个 API 的弃用,现在应该将这个工件视为完全弃用。我们强烈建议根据您需要的特定生命周期工件(例如,如果您使用 LifecycleService,则生命周期服务和生命周期流程,如果您使用 ProcessLifecycleOwner)而不是生命周期扩展,因为将来不会有 2.3.0 版本生命周期扩展。

正如文档所引用的那样,您可以改用特定的生命周期工件:正如我们在评论中讨论的那样,有效的特定生命周期工件是:

implementation "android.arch.lifecycle:runtime:$lifecycle_version

并保留您的其他生命周期依赖项工件。


推荐阅读