无法解析 AppCompatActivity 上的符号 ViewModelProviders

Posted

技术标签:

【中文标题】无法解析 AppCompatActivity 上的符号 ViewModelProviders【英文标题】:Cannot resolve symbol ViewModelProviders on AppCompatActivity 【发布时间】:2018-08-30 12:44:09 【问题描述】:

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

我在该主题上发现的所有其他问题都将extends Activity 更正为extends AppCompatActivity,但我正在扩展正确的问题。不知道我错过了什么...... 我的代码基于This YouTube video

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;

【问题讨论】:

“无法解析符号”表示您没有 import 语句,或者您有但您的 Gradle 设置中没有依赖项。 检查 build.gradle 中是否有 android.arch.lifecycle:extensions 的依赖 要么他正在使用一些库并在 gradle 文件中添加了依赖项,因此他能够导入 ViewModel,要么他在不同的包下有自定义类 ViewModel,他正在从那里导入它 没有扩展作为依赖。谢谢@MuthukrishnanRajendran 【参考方案1】:

在我的情况下(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-extentions 是不够的)

更新

看来你不用再包含gradle实现行('androidx.lifecycle:lifecycle-extensions:2.2.0')来实例化ViewModelProvider了。

【讨论】:

androidx.lifecycle:lifecycle-extensions 已弃用 developer.android.com/jetpack/androidx/releases/lifecycle【参考方案2】:

android.arch.lifecycle:extensions 已弃用

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

像这样创建视图模型的实例

Java

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

科特林

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

【讨论】:

【参考方案3】:

-'ViewModelProviders' 现已弃用

现在替代
在 java 中

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

在 kotlin 中

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

参考 - https://developer.android.com/reference/androidx/lifecycle/ViewModelProviders

【讨论】:

【参考方案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);

【讨论】:

【参考方案5】:

在我的情况下,我面临以下问题,即:

** 无法访问 androidx.lifecycle.has 默认 viewmodelprovider 工厂,它是您的类名称的 subclass,检查您的模块类路径检查您的模型冲突依赖项**

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

def lifecycle_version = "2.2.0"

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

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

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

【讨论】:

【参考方案6】:

在我的应用程序(java)中运行良好 之前

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

更改为

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

希望对你有帮助

【讨论】:

【参考方案7】:

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

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

所以请确保您使用的是import androidx.lifecycle.ViewModelProviders;。那是ViewModelProviderss

【讨论】:

【参考方案8】:

如果你使用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 演示应用程序。 查看此链接以获取最新的androidx版本developer.android.com/jetpack/androidx/migrate 有什么愚蠢的! ViewModelProvider 无需依赖即可使用,但对于 ViewModelProviders,我们需要额外的依赖。【参考方案9】:

我从Android official documentation 解决了这个问题。在下面添加到build.grale

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

【讨论】:

【参考方案10】:

使用androix

改变

implementation 'com.android.support:appcompat-v7:28.0.0'

implementation 'androidx.appcompat:appcompat:1.1.0-alpha03'

你可以使用

Refactor>Migrate to AndroidX

【讨论】:

【参考方案11】:

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

def 生命周期版本 = "2.0.0"

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

【讨论】:

【参考方案12】:

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

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

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

【讨论】:

要了解android.arch.lifecycle:extensions 的最新版本,您可以在maven.google.com/web/index.html 中搜索extensions 并查看最新版本 androidx.lifecycle:lifecycle-extensions 已弃用 developer.android.com/jetpack/androidx/releases/lifecycle【参考方案13】:

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

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

【讨论】:

【参考方案14】:

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

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

感谢@Muthukrishnan Rajendran

【讨论】:

@Sheler 你的答案是正确的,但文档是错误的。在文档中指定 ViewModel 和 LiveDat 都在实现“android.arch.lifecycle:extensions:1.1.1” 嗯,这个解决方案仍然没有解决我的问题。我在我的应用程序 gradle 和 allprojects repositories google() jcenter() 中实现了 'android.arch.lifecycle:extensions:1.1.1' 是否还有其他需要添加的内容? 我看到 ViewModelProvider 类,但它没有 .of() 方法。 ViewModelProviders 仍未定义。如果这很重要,我在 Mac 上。 项目中是否需要添加 min sdk 或 java 8 定义? 没关系。如果 gradles 文件没有显示,请确保同步它。

以上是关于无法解析 AppCompatActivity 上的符号 ViewModelProviders的主要内容,如果未能解决你的问题,请参考以下文章

无法解析符号 AppCompatActivity - 无法识别支持 ​​v7 库?

无法解析符号“连接”

AppCompatActivity 中未解析的 Android Activity Results API 引用

42AppCompatActivity类无法找到

无法解析 style.xml 中的符号“主题”(Android Studio)

Hilt :- 无法在 AppCompatActivity 中使用 @AndroidEntryPoint 获取 DefaultViewModelFactories 异常?