ไม่สามารถแก้ไขสัญลักษณ์ ViewModelProviders บน AppCompatActivity


122

สวัสดีฉันกำลังพยายามทำให้ ViewModel ของฉันทำงาน แต่ยังไม่มีโชค Cannot resolve symbol 'ViewModelProviders'ข้อผิดพลาดการแสดง Android สตูดิโอ

ทุกคำถามอื่น ๆ ผมพบว่าในหัวข้อนี้ได้รับการแก้ไข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
"ไม่สามารถแก้ไขสัญลักษณ์" หมายความว่าคุณไม่มีimportคำสั่งหรือคุณทำ แต่คุณไม่มีการพึ่งพาในการตั้งค่า Gradle ของคุณ
CommonsWare

9
ตรวจสอบว่าคุณมี dependecy สำหรับandroid.arch.lifecycle: extensionsใน build.gradle
Muthukrishnan Rajendran

ไม่ว่าเขาจะใช้ไลบรารีบางส่วนและเพิ่มการพึ่งพาในไฟล์ gradle เพื่อให้เขาสามารถนำเข้า ViewModel ได้หรือเขามีคลาสที่กำหนดเองViewModelภายใต้แพ็คเกจที่แตกต่างกันและเขากำลังนำเข้าจากที่นั่น
Akshay Katariya

ไม่มีส่วนขยายเป็นการอ้างอิง ขอบคุณ @MuthukrishnanRajendran
Sheler

คำตอบ:


203

ฉันไม่มีการอ้างอิงทั้งสองอย่างในบิลด์ของฉันด้วยเหตุนี้ปัญหา

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

ขอบคุณ @Muthukrishnan Rajendran


7
@ Sheler คุณตอบถูก แต่เอกสารผิด ในเอกสารระบุว่าทั้ง ViewModel และ LiveDat กำลังใช้งาน "android.arch.lifecycle: extensions: 1.1.1"
Pritish

2
อืมวิธีนี้ยังไม่สามารถแก้ปัญหาของฉันได้ ฉันมีการใช้งาน 'android.arch.lifecycle: extensions: 1.1.1' ใน app gradle และ allprojects {ที่เก็บ {google () jcenter ()}} มีอย่างอื่นที่ต้องเพิ่มอีกไหม
musterjunk

1
ฉันเห็นคลาส ViewModelProvider แต่ไม่มีเมธอด. of () ยังไม่ได้กำหนด ViewModelProviders ฉันใช้ Mac ถ้าเป็นเรื่องสำคัญ
musterjunk

มีนิยาม min sdk หรือ java 8 ที่ต้องเพิ่มในโปรเจ็กต์หรือไม่?
musterjunk

ไม่เป็นไร. ตรวจสอบให้แน่ใจว่าคุณซิงค์ไฟล์ gradles ของคุณหากไม่ปรากฏขึ้น
musterjunk

96

หากคุณใช้androidxคุณต้องการสิ่งนี้:

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

สำหรับใครก็ตามที่มีปัญหานี้คุณต้องใช้สิ่งนี้ในแอป gradle ของคุณ: ใช้ปลั๊กอิน: 'androidx.navigation.safeargs' และสิ่งนี้ใน Android gradle: classpath "android.arch.navigation: navigation-safe-args-gradle-plugin : 1.0.0-alpha06 "หากคุณมีปัญหาในการวางสิ่งเหล่านี้ให้ดูในแอปสาธิต android -flower จาก google
findusl

1
ตรวจสอบลิงค์นี้สำหรับนักพัฒนา
user2301281

โง่อะไร! ViewModelProvider สามารถใช้งานได้โดยไม่ต้องพึ่งพา แต่สำหรับ ViewModelProviders เราต้องการการพึ่งพาเพิ่มเติม
Rahul Rastogi

15

หากคุณใช้ sdk เวอร์ชัน 28 หรือสูงกว่าที่คอมไพล์แล้วคุณจะต้องเพิ่มการพึ่งพาเพียงครั้งเดียวเพื่อรับViewModelและLiveData

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

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

หากต้องการทราบเวอร์ชันล่าสุดandroid.arch.lifecycle:extensionsคุณสามารถค้นหาextensionsในmaven.google.com/web/index.htmlและดูเวอร์ชันล่าสุด
Sanjeev

12

android.arch.lifecycle: ส่วนขยายเลิกใช้แล้ว

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

สร้างอินสแตนซ์ของ viewmodel ดังนี้:

ชวา

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

Kotlin

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

5

คุณควรเพิ่มไลบรารีใน build.gradle ของโปรเจ็กต์ของคุณ

def lifecycle_version = "2.0.0"

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

5

ผมแก้ปัญหานี้มาจากเอกสารที่เป็นทางการของ Android เพิ่มด้านล่างไปที่build.grale

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

5

ในกรณีของฉัน (Android Studio 3.6.3) ใน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ไม่เพียงพอ)


3

ในไฟล์ 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"
...
}

ภาพตัวอย่างของไฟล์ build.gradle


2

ใช้androixไลบรารี

เปลี่ยนแปลง

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

ถึง

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

คุณสามารถใช้ได้

Refactor>Migrate to AndroidX

2

ในการใช้งาน "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);


1

ทำงานได้ดีในแอพของฉัน (java) มาก่อน

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

เปลี่ยนเป็น

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

หวังว่ามันจะช่วยได้


1

ในกรณีของฉันฉันประสบปัญหาด้านล่างเช่น:

** ไม่สามารถเข้าถึง androidx.lifecycle. มีโรงงาน viewmodelprovider เริ่มต้นซึ่งเป็นใส่คำอธิบายภาพที่นี่คลาสย่อยของชื่อคลาสของคุณตรวจสอบคลาสพา ธ โมดูลของคุณตรวจสอบการอ้างอิงที่ขัดแย้งกันของโมเดลของคุณ **

ฉันเพิ่มด้านล่างอ้างอิงในของฉันbuild.gradle โครงการ

def lifecycle_version = "2.2.0"

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

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

จากนั้นฉันสร้างชั้นเรียนในโครงการโมดูลและฉันประสบปัญหานี้จากนั้นฉันเพิ่มไลบรารีเหล่านี้ในไฟล์build.gradle โมดูลและปัญหาได้รับการแก้ไข


0

ผมมีปัญหาเหมือนกัน. ไม่มีวิธีแก้ปัญหาอื่นใดช่วยฉันได้

ฉันรู้ว่าฉันใช้import androidx.lifecycle.ViewModelProvider;แทนimport androidx.lifecycle.ViewModelProviders;.

import androidx.lifecycle.ViewModelProviders;เพื่อให้แน่ใจว่าคุณกำลังใช้ นั่นคือViewModelProvidersด้วยsไฟล์.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.