Không thể giải quyết biểu tượng ViewModelProviders trên AppCompatActivity


122

Này, tôi đang cố gắng làm cho ViewModel của mình hoạt động, nhưng không may mắn cho đến nay. Android Studio hiển thị lỗi Cannot resolve symbol 'ViewModelProviders'.

Mỗi câu hỏi khác tôi thấy về chủ đề này đã được sửa chữa extends Activityđể extends AppCompatActivity, nhưng tôi đang mở rộng một trong những quyền. Không chắc mình đang thiếu gì ...
Mã của tôi dựa trên video YouTube này

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
"Không thể giải quyết biểu tượng" có nghĩa là bạn không có importcâu lệnh hoặc bạn có nhưng bạn không có sự phụ thuộc trong thiết lập Gradle của mình.
CommonsWare

9
Kiểm tra bạn có dependecy cho android.arch.lifecycle: phần mở rộng trong build.gradle
Muthukrishnan Rajendran

Hoặc là ông đang sử dụng một số thư viện và bổ sung phụ thuộc vào tập tin gradle vì vậy anh có thể nhập ViewModel hoặc ông có lớp tùy chỉnh ViewModelthuộc gói khác nhau và ông được nhập khẩu từ đó
Akshay Katariya

Không có phần mở rộng là phần phụ thuộc. Cảm ơn @MuthukrishnanRajendran
Sheler 21/03/18

Câu trả lời:


203

Tôi không có cả hai yếu tố phụ thuộc trong bản dựng của mình, do đó có vấn đề.

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

Cảm ơn @Muthukrishnan Rajendran


7
@Sheler Câu trả lời của bạn là đúng nhưng tài liệu sai. Trong tài liệu có chỉ định rằng ViewModel và LiveDat đều đang được triển khai "android.arch.lifecycle: extensions: 1.1.1"
Pritish

2
Rất tiếc, giải pháp này vẫn không giải quyết được vấn đề của tôi. Tôi có triển khai 'android.arch.lifecycle: extensions: 1.1.1' trong ứng dụng gradle và allprojects của mình {repositories {google () jcenter ()}} Có thứ gì khác cần thêm không?
musterjunk

1
Tôi thấy lớp ViewModelProvider nhưng nó không có phương thức .of (). ViewModelProviders vẫn chưa được xác định. Tôi đang sử dụng máy mac nếu điều đó quan trọng.
musterjunk

Có định nghĩa min sdk hoặc java 8 cần được thêm vào dự án không?
musterjunk

Đừng bận tâm. Đảm bảo rằng bạn đồng bộ hóa các tệp gradles của mình nếu nó không hiển thị.
musterjunk

96

Nếu bạn đang sử dụng, androidxbạn cần cái này:

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

Đối với bất kỳ ai khác gặp sự cố này, bạn cũng cần cái này trong ứng dụng gradle: áp dụng plugin: 'androidx.navigation.safeargs' và cái này trong android gradle: classpath "android.arch.navigation: navigation-safe-args-gradle-plugin : 1.0.0-alpha06 "Nếu bạn gặp khó khăn khi đặt những thứ này ở đâu, hãy tìm trong ứng dụng trình diễn android-hướng dương từ google.
findusl,

1
kiểm tra liên kết này để biết phiên bản androidx mới nhất developer.android.com/jetpack/androidx/migrate
user2301281

Có gì là ngu ngốc! ViewModelProvider có sẵn mà không phụ thuộc nhưng đối với ViewModelProviders, chúng tôi cần thêm một phụ thuộc.
Rahul Rastogi

15

Nếu bạn đang sử dụng sdk đã biên dịch phiên bản 28 trở lên, bạn chỉ cần thêm một phụ thuộc duy nhất để nhận ViewModelLiveData

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

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

Để biết phiên bản mới nhất của android.arch.lifecycle:extensionsbạn có thể tìm kiếm extensionstrong maven.google.com/web/index.html và xem phiên bản mới nhất
Sanjeev

11

android.arch.lifecycle: các tiện ích mở rộng không được dùng nữa

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

Tạo phiên bản của view model như sau:

Java

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

Kotlin

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

5

bạn nên thêm thư viện vào build.gradle của dự án

def lifeecycle_version = "2.0.0"

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


5

Trong trường hợp của tôi (Android Studio 3.6.3), AppCompatActivityđể thực hiện thành công:

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

nó cần cả hai:

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

(một mình với lifecycle-extentionslà không đủ)


3

Trong tệp build.gradle, hãy thêm các dòng này vào khối phụ thuộc

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

Hình ảnh mẫu của tệp build.gradle


2

Sử dụng androixthư viện

Thay đổi

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

đến

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

Bạn có thể dùng

Refactor>Migrate to AndroidX

2

Trong triển khai "androidx.lifecycle: lifeecycle-extensions: 2.2.0" trở lên ViewModelProviders không được dùng nữa, hãy sử dụng

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

hoặc ở Kotlin

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

thay vì

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


1

Hoạt động tốt trong ứng dụng của tôi (java) trước đây

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

thay đổi

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

hy vọng nó có thể giúp


1

Trong Trường hợp của tôi, tôi đang gặp phải vấn đề dưới đây, tức là:

** không thể truy cập androidx.lifecycle. có một nhà máy chế tạo viewmodelprovider mặc định là nhập mô tả hình ảnh ở đâylớp con của Tên lớp của bạn, hãy kiểm tra đường dẫn phân hệ mô-đun của bạn, kiểm tra các phụ thuộc xung đột mô hình của bạn **

Tôi đã thêm các phụ thuộc bên dưới vào build.gradle dự án của mình .

def lifecycle_version = "2.2.0"

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

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

Sau đó, tôi tạo lớp của mình trong một dự án mô-đun và tôi đang gặp phải vấn đề này, sau đó tôi thêm các thư viện này trong tệp module build.gradle và sự cố đã được giải quyết.


0

Tôi đã từng gặp vấn đề tương tự. Không có giải pháp nào khác giúp tôi.

Tôi nhận ra rằng tôi đang sử dụng import androidx.lifecycle.ViewModelProvider;thay vì import androidx.lifecycle.ViewModelProviders;.

Vì vậy, hãy chắc chắn rằng bạn đang sử dụng import androidx.lifecycle.ViewModelProviders;. Đó là ViewModelProvidersvới một s.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.