【问题标题】:Cannot resolve symbol ViewModelProviders on AppCompatActivity无法解析 AppCompatActivity 上的符号 ViewModelProviders
【发布时间】: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

标签: android viewmodel android-architecture-components


【解决方案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"
                    }
                    

                    【讨论】:

                    【解决方案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 文件没有显示,请确保同步它。
                      猜你喜欢
                      • 2015-05-25
                      • 2018-11-11
                      • 2016-12-31
                      • 1970-01-01
                      • 2015-08-28
                      • 2016-04-29
                      • 1970-01-01
                      相关资源
                      最近更新 更多