无法解析AppCompatActivity上的符号ViewModelProviders


122

嘿,我正在尝试使ViewModel正常工作,但是到目前为止还没有运气。Android Studio显示错误Cannot resolve symbol 'ViewModelProviders'

我在此主题上发现的所有其他问题都已纠正extends Activityextends AppCompatActivity,但我正在扩展正确的问题。不确定我缺少什么...
我的代码基于此YouTube视频

MainActivity.java

public class MainActivity extends AppCompatActivity implements
    TileAdapter.TileAdapterOnClickHandler {


private BaseViewModel viewModel;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //set Toolbar
    Toolbar myToolbar = findViewById(R.id.toolbar);
    setSupportActionBar(myToolbar);


    //initialize viewModel
    viewModel = ViewModelProviders.of(this).get(BaseViewModel.class);

BaseViewModel.java

public class BaseViewModel extends ViewModel {

private Movie[] mMovie;

public void init (Movie[] movies){
    this.mMovie = movies;
}

public Movie[] getMovie() {
    return mMovie;
}

1
“无法解析符号”表示您没有该import语句,或者您有,但是在Gradle设置中没有依赖项。
CommonsWare

9
检查您是否对build.gradle中的android.arch.lifecycle:extensions有依赖性
Muthukrishnan Rajendran,

无论他是用一些图书馆和加入gradle这个文件的依赖性,所以他能够导入视图模型或他有自定义类ViewModel不同的包下,他从那里将其导入
阿克沙伊Katariya

没有扩展名作为依赖项。感谢@MuthukrishnanRajendran
Sheler,

Answers:


203

我的构建中没有两个依赖项,因此出现了问题。

implementation "android.arch.lifecycle:extensions:1.1.0"
implementation "android.arch.lifecycle:viewmodel:1.1.0"

谢谢@Muthukrishnan Rajendran


7
@Sheler您的回答是正确的,但是文档是错误的。在文档中,指定ViewModel和LiveDat都在实现“ android.arch.lifecycle:extensions:1.1.1”中
普里奇(British)

2
嗯,这个解决方案仍然没有解决我的问题。我的应用程式gradle和allprojects {储存库{google()jcenter()})中有实作'android.arch.lifecycle:extensions:1.1.1',还需要添加其他内容吗?
musterjunk

1
我看到了ViewModelProvider类,但是它没有.of()方法。ViewModelProviders仍未定义。如果这很重要,我在Mac上。
musterjunk

是否需要将最小sdk或java 8定义添加到项目中?
musterjunk

没关系。如果没有显示,请确保同步gradles文件。
musterjunk

96

如果您正在使用androidx,则需要这样做:

implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'

对于任何其他有此问题的人,您也需要在应用程序gradle中使用它:apply plugin:'androidx.navigation.safeargs'和在Android gradle中使用:classpath“ android.arch.navigation:navigation-safe-args-gradle-plugin :1.0.0-alpha06“如果您在哪里放置这些东西有麻烦,请查看Google的android-sunflower演示应用。
findusl

1
检查此链接以获取最新的androidx版本developer.android.com/jetpack/androidx/migrate
user2301281

多么愚蠢!ViewModelProvider无需依赖即可使用,但对于ViewModelProviders,我们需要额外的依赖。
拉胡尔·拉斯托吉 Rahul Rastogi),

15

如果您使用的是编译后的SDK版本28或更高版本,则只需添加单个Dependecy即可 ViewModelLiveData

dependencies {
    //...
    def lifecycle_version = "1.1.1"

    // ViewModel and LiveData
    implementation "android.arch.lifecycle:extensions:$lifecycle_version"
}

要了解的最新版本,android.arch.lifecycle:extensions您可以extensionsmaven.google.com/web/index.html中搜索并查看最新版本
Sanjeev,

11

android.arch.lifecycle:extensions已弃用

def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"

创建如下的viewmodel 实例

爪哇

Yourclass obj = new ViewModelProvider(context).get(ClassViewModel.class);

科特林

var obj = ViewModelProvider(context).get(ClassViewModel::class.java)

5

您应该在项目的build.gradle中添加库

def lifecycle_version =“ 2.0.0”

// ViewModel and LiveData
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"

5

我从Android官方文档中解决了这个问题。在下面添加到build.grale

def lifecycle_version = "2.0.0"
// ViewModel and LiveData
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"

5

就我而言(Android Studio 3.6.3),AppCompatActivity要成功执行以下操作:

MyViewModel myViewModel = new ViewModelProvider(this).get(MyViewModel.class);

这两个都需要:

implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

(仅凭lifecycle-extentions不足)


3

在build.gradle文件中,将这些行添加到dependencies块中

dependencies {
...
def lifecycle_version = "1.1.1"
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
//if not using java 8,use the following line
annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version"
//if using java 8,ignore above line and add the following line
implementation "android.arch.lifecycle:common-java8:$lifecycle_version"
...
}

build.gradle文件的样本图像



2

在实现“ androidx.lifecycle:lifecycle-extensions:2.2.0”及更高版本中,不建议使用ViewModelProviders,请使用

viewModel = ViewModelProvider(this).get(BaseViewModel.class);

或在科特林

viewModel = ViewModelProvider(this).get(BaseViewModel::class.java);

代替

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


1

在我的应用程序(java)中可以正常工作

loginViewModel = ViewModelProviders.of(this, new LoginViewModelFactory())
                .get(LoginViewModel.class);

更改为

loginViewModel = new ViewModelProvider(this,new LoginViewModelFactory()).get(LoginViewModel.class);

希望它可以帮助


1

就我而言,我面临以下问题,即:

**无法访问androidx.lifecycle.has具有默认的viewmodelprovider工厂,它是在此处输入图片说明您的类Name 的子类,请检查您的模块类路径,检查您的模型冲突的依赖项**

我在项目build.gradle中添加了以下依赖

def lifecycle_version = "2.2.0"

implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"

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

然后,我在一个模块项目中创建我的类,并且遇到了这个问题,然后将这些库添加到模块的build.gradle文件中,此问题已解决。


0

我有同样的问题。其他解决方案都没有帮助我。

我意识到我正在使用import androidx.lifecycle.ViewModelProvider;而不是import androidx.lifecycle.ViewModelProviders;

因此,请确保您正在使用import androidx.lifecycle.ViewModelProviders;。那是ViewModelProviders一个s

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.