无法解析 AppCompatActivity 上的符号 ViewModelProviders

Cannot resolve symbol ViewModelProviders on AppCompatActivity

嘿,我正在尝试让我的 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;
}

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

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

感谢@Muthukrishnan Rajendran

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

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

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

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

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

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

您应该在项目的 build.gradle

中添加库

def lifecycle_version = "2.0.0"

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

使用 androix 个库

改变

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

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

您可以使用

Refactor>Migrate to AndroidX

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

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

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

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

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

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

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

更改为

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

希望对您有所帮助

android.arch.lifecycle:extensions is deprecated use

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);

Kotlin

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

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

** cannot access androidx.lifecycle.has a default viewmodelprovider factory which is a subclass of your class Name, check your module classpath check your model conflicting dependencies **

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

def lifecycle_version = "2.2.0"

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

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

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

在实施中 "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);

以我为例 (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

-'ViewModelProviders' 已弃用 现在

  • 现在备选
  • In java

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

  • In kotlin

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

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