在AppCompatActivity中无法解析ViewModelProviders符号

139

嘿,我正在尝试让我的ViewModel工作,但迄今为止没有成功。Android Studio显示错误无法解析符号'ViewModelProviders'

我在这个主题上找到的每一个其他问题都是将extends Activity更正为extends 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
"Cannot resolve symbol" 的意思是你可能没有 import 语句,或者你有这个语句但是在 Gradle 设置中缺少依赖项。 - CommonsWare
11
请检查您的build.gradle文件中是否有对android.arch.lifecycle:extensions的依赖。 - Muthukrishnan Rajendran
他可能正在使用某个库,并在gradle文件中添加了依赖项,以便能够导入ViewModel;或者他有一个自定义的ViewModel类位于不同的包中,并从那里导入它。 - Akshay Katariya
没有扩展作为依赖项。感谢@MuthukrishnanRajendran。 - Sheler
14个回答

221

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

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

感谢 @Muthukrishnan Rajendran


7
@Sheler 你的答案是正确的,但是文档是错的。文档中指定了ViewModel和LiveData都在实现"android.arch.lifecycle:extensions:1.1.1"中。 - BraveEvidence
2
嗯,这个解决方案仍然没有解决我的问题。我在我的应用gradle中实现了'android.arch.lifecycle:extensions:1.1.1',并且在allprojects { repositories { google() jcenter() } }中添加了所有项目。还需要添加其他内容吗? - musterjunk
1
我看到了ViewModelProvider类,但它没有.of()方法。ViewModelProviders仍未定义。如果有影响的话,我正在使用Mac。 - musterjunk
需要在项目中添加最小SDK或Java 8的定义吗? - musterjunk
@musterjunk 这是针对 ViewModelProviders 而不是 ViewModelProvider。 - Meysam Hadigheh
显示剩余2条评论

113

如果你正在使用 androidx,你需要这个:

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

1
对于其他遇到这个问题的人,你还需要在应用程序gradle中添加以下内容: apply plugin: 'androidx.navigation.safeargs' 并且在你的android gradle中添加以下内容: classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0-alpha06" 如果你不知道在哪里添加这些内容,请查看谷歌的android-sunflower演示应用程序。 - findusl
2
请查看此链接以获取最新的AndroidX版本:https://developer.android.com/jetpack/androidx/migrate - user2301281
1
这是什么愚蠢的事情!ViewModelProvider可以不需要依赖就可用,但对于ViewModelProviders我们需要额外的依赖。 - Rahul Rastogi

31

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实例:

Java


Java

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

Kotlin

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

好的,但如果在Fragment中创建,则“owner”可能不是“context”。 - htafoya

15

如果您正在使用编译的sdk版本28或更高版本,则只需要添加单个依赖项即可获得ViewModelLiveData

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

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

要了解 android.arch.lifecycle:extensions 的最新版本,您可以在 https://maven.google.com/web/index.html 中搜索 extensions 并查看最新版本。 - Sanjeev
2
androidx.lifecycle:lifecycle-extensions 已被弃用 https://developer.android.com/jetpack/androidx/releases/lifecycle - Jack

10
在我的情况下(Android Studio 3.6.3 ~ 4.1.2),在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-extensions 是不够的)

更新

看起来你现在不再需要包含 gradle 实现行 ('androidx.lifecycle:lifecycle-extensions:2.2.0') 来实例化 ViewModelProvider


androidx.lifecycle:lifecycle-extensions 已被弃用 developer.android.com/jetpack/androidx/releases/lifecycle - Jack

5
我从Android官方文档中解决了这个问题。 将以下内容添加到build.gradle中。
def lifecycle_version = "2.0.0"
// ViewModel and LiveData
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"

5

您需要在项目的build.gradle中添加库。

def lifecycle_version = "2.0.0"

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

4
在实现中,“androidx.lifecycle:lifecycle-extensions:2.2.0”及更高版本的“ViewModelProviders”已被弃用,请使用。
viewModel = ViewModelProvider(this).get(BaseViewModel.class);

或者使用 Kotlin

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

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

只返回所需的正确信息。非常感谢。 - Fazal

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"
...
}

Sample Image of build.gradle file


3

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