在Activity中无法实例化ViewModel

9
我试图实例化一个ViewModel,在所有的Activity中使用。
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 Developer关于实现ViewModel的示例,扩展ViewModel的类应该能够在Activity中被实例化,我是对的吗?
如果我的操作有误,那么我应该如何为我的Activity(s)实例化ViewModel对象呢?我是否必须创建具有Fragment(s)的n个Activity(s),因为ViewModelProviders.of()只适用于Fragment?

1
尝试使用AppCompatActivity。 - Kuffs
6个回答

24

您需要使用support library 中的activity。

AppCompatActivityFragmentActivity


10

@elmorabea的回答是正确的,但这里需要注意的一件重要的事情是,如果你启用了AndroidX,仍然出现需要传递碎片而不是活动的问题,请确保你的类扩展了正确的 AppCompatActivity。即确保你正在使用:

import androidx.appcompat.app.AppCompatActivity;

而不是

import android.support.v7.app.AppCompatActivity;

其中一个来自AndroidX,而另一个则不是。有关AndroidX迁移的更多信息,请参见此链接


5
你正在扩展Activity类。 ViewModelProvidersFragmentActivity和从其继承的事物(如AppCompatActivity)一起工作。它还可以与Fragment的后备(android.support.v4.app.Fragment)一起使用。原生ActivityFragment类没有官方支持。

1
我正在从AppCompatActivity进行扩展。但仍然显示错误,即“无法解析ViewModelProvider.of()”。 - Mudasir Sharif
3
你的ViewModelProviders中缺少一个"s"。如果仍然无法工作,请确保你的Gradle文件包含依赖项,例如compile 'android.arch.lifecycle:extensions:1.1.1'。 - Dabbler
1
你可能导入了 androidx.lifecycle.ViewModelProviders 而不是 android.arch.lifecycle.ViewModelProviders - Ewald Benes

5

如果您不想将活动更改为扩展另一个Activity类的解决方案(例如,如果您的BaseActivity已经在使用并且严重依赖于Activity,则更改父活动类可能会导致错误):

@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中的逻辑相似。
然后,我们不再调用ViewModelProviders.of(this),而是只需要调用getViewModelProvider()来获取Controller
control = getViewModelProvider().get(Controller.class)

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

这是一个有帮助的解决方案。谢谢。 - undefined

1
对于我来说,我正在扩展AppCompatActivity,但仍然不能正常工作。但是缺少implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0',添加后它就可以正常工作了。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接