无法在 Activity 中实例化 ViewModel

ViewModel cannot be instantiated in an Activity

我正在尝试实例化一个 ViewModel 以在我的所有 Activity(s) 中使用。

public class LaunchActivity extends Activity {
    private Controller control;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_launch);
         control = ViewModelProviders.of(this).get(Controller.class);
    }
}

但我在 control = ViewModelProviders.of(this) <-- 处收到一个错误,指出它无法解析 of(this),但基于 Android 开发人员关于实施 ViewModel 的示例 here;扩展 ViewModel 的 class 应该能够在 Activity 上实例化,对吗?

如果我做错了,我应该如何为我的 Activity(s) 实例化一个 ViewModel 对象?我是否必须创建 n 数量的 Activity(s) 与 Fragment(s) 因为 ViewModelProviders.of() 仅适用于 Fragment?

您正在扩展 ActivityViewModelProvidersFragmentActivity 以及从其继承的东西一起使用,例如 AppCompatActivity。它还适用于 Fragment (android.support.v4.app.Fragment) 的反向移植。没有官方支持原生 ActivityFragment class.

您需要使用 support library activity.

AppCompatActivityFragmentActivity

另一个解决方案,如果你不想改变你的 activity 以从另一个 Activity class 扩展(如果你的 BaseActivity 已经被使用并且依赖严重依赖 Activity,如果更改父 activity class) 可能会导致错误:

@Nullable
private ViewModelStore viewModelStore = null;

@Override
public Object onRetainNonConfigurationInstance() {
    return viewModelStore;
}

@NonNull
private ViewModelStore getViewModelStore() {
    Object nonConfigurationInstance = getLastNonConfigurationInstance();
    if (nonConfigurationInstance instanceof ViewModelStore) {
        viewModelStore = (ViewModelStore) nonConfigurationInstance;
    }
    if (viewModelStore == null) {
        viewModelStore = new ViewModelStore();
    }
    return viewModelStore;
}

public ViewModelProvider getViewModelProvider() {
    ViewModelProvider.Factory factory =
            ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication());
    return new ViewModelProvider(getViewModelStore(), factory);
}

这个逻辑类似于FragmentActivity

中的逻辑

那么,我们只需要调用getViewModelProvider(),而不是调用ViewModelProviders.of(this)。为了获得 Controller:

control = getViewModelProvider().get(Controller.class)

通过这样做,我们不需要添加 android.arch.lifecycle:extensions 依赖项。

我正在使用这个:

 LoginViewModel viewModel = ViewModelProviders.of(this).get(LoginViewModel.class);

参考:https://developer.android.com/topic/libraries/architecture/viewmodel#java

@elmorabea 的回答是正确的,但这里需要注意的一件重要事情是,如果您启用了 AndroidX 并且仍然遇到表明您需要传入片段而不是 activity,确保您的 class 扩展了 正确的 AppCompatActivity。 IE,确保你使用的是:

import androidx.appcompat.app.AppCompatActivity;

而不是

import android.support.v7.app.AppCompatActivity;

因为一个来自 AndroidX 而另一个不是。有关 AndroidX 迁移的详细信息,请参阅 this link。

对我来说,我正在扩展 AppCompatActivity,但它仍然无法正常工作。但是 implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' 不见了,添加它工作正常。