programing

View Model Providers는 1.1.0에서 더 이상 사용되지 않습니다.

oldcodes 2023. 8. 17. 21:51
반응형

View Model Providers는 1.1.0에서 더 이상 사용되지 않습니다.

다음에 대한 Google 문서 보기ViewModel▁a▁to▁on▁code▁get를 얻는 방법에 대한 아래 샘플 .ViewModel:

val model = ViewModelProviders.of(this).get(MyViewModel::class.java)

최신 종속성을 사용하는 경우android.arch.lifecycle:extensions:1.1.1 클래스는 .ViewModelProviders.

다음에 대한 설명서 참조ViewModelProviders다음과 같은 댓글을 보았습니다.

이 클래스는 API 수준 1.1.0에서 더 이상 사용되지 않습니다.View Model Provider를 사용합니다.안드로이드 뷰 모델 팩토리

는, 문는제를 할 때, 려하고할때를 사용한다는 것입니다.ViewModelProvider.AndroidViewModelFactory하는 것찾한을수없을 수 .ofViewModel.

제가 시도한 것:

ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java)

방법의 은 " 따서메의이름은드소"입니다.createView Model을 호출할 때마다 새로운 View Model 인스턴스가 표시되지만, 이는 제가 원하는 것이 아닙니다.

위의 사용되지 않는 코드를 대체하는 것이 무엇인지 생각해 보셨습니까?

라이프사이클 확장 기능을 사용합니다.2.2.0버전:

implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" 

과 같이 합다니야해를 작동해야 .ViewModelProvider 생성자

// With ViewModelFactory   
val viewModel = ViewModelProvider(this, YourViewModelFactory).get(YourViewModel::class.java)


//Without ViewModelFactory
val viewModel = ViewModelProvider(this).get(YourViewModel::class.java)

2020/5/15 업데이트

저는 이것을 성취하기 위한 또 다른 우아한 방법을 찾았습니다, 안드로이드 KTX는 도움을 줄 수 있습니다.

implementation "androidx.fragment:fragment-ktx:1.2.4"
val viewmodel: MYViewModel by viewModels()
val viewmodel: MYViewModel by viewModels { myFactory } //With factory

참조: https://developer.android.com/reference/kotlin/androidx/fragment/app/package-summary#viewmodels

2020/06/25: 대표자 사례 수정

@FantasyFang이 그의 대답에서 언급했듯이, 최신 버전을 사용합니다.lifecycle:lifecycle-extensions지금 이 순간에.2.2.0-alpha03따라서 build.gradle 파일에 다음 행을 추가해야 합니다.

implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0-alpha03' 

Java를 사용하는 사용자는 이 문제를 해결하기 위해 ViewModelProvider의 생성자에게 직접 인수를 전달합니다.

MyViewModel viewModel = new ViewModelProvider(this, myViewModelFactory).get(MyViewModel.class);

또는 공장을 사용하지 않는 경우 다음을 사용합니다.

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

공장 객체를 전달하지 않고 말입니다.

수입품

사용되지 않는 시작:


  
   import androidx.lifecycle.ViewModelProviders;
  

받는 사람:

import androidx.lifecycle.ViewModelProvider;

사용.

사용되지 않는 시작:


  
   ViewModelProviders.of
  (this, provider).get(VM::class.java)

받는 사람:

ViewModelProvider(this, provider).get(VM::class.java)

2.2.0부터는 라이프사이클 확장이 더 이상 사용되지 않습니다.Google 설명서를 참조하십시오.

다음은 페이지에서 잘라낸 내용입니다.

라이프사이클 확장의 API는 더 이상 사용되지 않습니다.대신 필요한 특정 라이프사이클 아티팩트에 대한 종속성을 추가합니다.

새 라이브러리는 다음과 같습니다.

// ViewModel and lifecycle support for java
implementation "androidx.lifecycle:lifecycle-viewmodel:${versions.lifecycle}"
implementation "androidx.lifecycle:lifecycle-livedata:${versions.lifecycle}"

// ViewModel and lifecycle support for kotlin
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:${versions.lifecycle}"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:${versions.lifecycle}"

JAVA의 새로운 코드:

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

또는 코틀린의 경우:

viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

업데이트 2020-06-16: 현재 ViewModelProviders는 더 이상 사용되지 않으므로 더 이상 사용해서는 안 됩니다.이 질문과 대답은 그렇지 않았던 2018년 말의 것이었습니다.이 질문과 대답은 또한 이전 아키텍처 구성 요소 버전에 대한 것입니다.ViewModelProvidersAndroid X 버전이 아닙니다.


최신 종속성을 사용하는 경우android.arch.lifecycle:extensions:1.1.1 클래스는 .ViewModelProviders.

네, 있습니다.이를 입증하는 방법:

  • 3새 Kotlin, Android Studio 3.2.1 파일).minSdkVersion "빈 활동)21, "빈 활동" 템플릿)

  • 더하다android.arch.lifecycle:extensions:1.1.1에의 종속 에.app 컨트롤 모듈

이것은 당신에게 줄 것입니다.app/build.gradle 예:

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.commonsware.myandroidarch"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'android.arch.lifecycle:extensions:1.1.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

그러면 라이브러리가 해당 클래스와 함께 "외부 라이브러리"에 표시되는 것을 볼 수 있습니다.

External Libraries

해당 클래스를 참조할 수 있습니다.

package com.commonsware.myandroidarch

import android.arch.lifecycle.ViewModelProviders
import android.support.v7.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val provider = ViewModelProviders.of(this)
  }
}

View Model Providers 설명서에서 다음과 같은 댓글을 보았습니다.이 클래스는 API 수준 1.1.0에서 더 이상 사용되지 않습니다.View Model Provider를 사용합니다.안드로이드 뷰 모델 팩토리

은 그댓은아있다니습래에 에 있습니다.ViewModelProviders.DefaultFactory 및 합니다.ViewModelProviders:

Documentation Screenshot

위의 사용되지 않는 코드를 대체하는 것이 무엇인지 생각해 보셨습니까?

사용하다ViewModelProviders.

2020년 초 Google은 버전 2.2.0의 Androidx 라이프사이클 라이브러리에서 ViewModelProviders 클래스를 폐지했습니다.

ViewModelProvider를 사용하여 ViewModel의 인스턴스를 생성할 필요가 없습니다. 대신 조각 또는 활동 인스턴스를 ViewModelProvider 생성자에게 전달할 수 있습니다.

다음과 같은 코드를 사용하는 경우:

val viewModel = ViewModelProviders.of(this).get(CalculatorViewModel::class.java)

View Model Providers가 더 이상 사용되지 않는다는 경고 메시지가 표시됩니다.

사용되지 않는 라이브러리를 사용하지 않으려면 다음을 변경합니다.

  1. build.gradle(모듈: app) 파일에서 라이프사이클 구성 요소의 버전 2.2.0을 사용합니다.

    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
    implementation "androidx.activity:activity-ktx:1.1.0"
    

    조각에서 View Model을 대신 사용하려면

    implementation "androidx.fragment:fragment-ktx:1.2.2"
    

    fragment-details에는 작업-details가 자동으로 포함되므로 종속성에 둘 다 지정할 필요가 없습니다.

  2. Android 섹션에서 Java 8을 지정해야 합니다.

    android {
        compileSdkVersion 28
        defaultConfig {
            applicationId "com.kgandroid.calculator"
            minSdkVersion 17
            targetSdkVersion 28
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner 
        "androidx.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 
               'proguard-rules.pro'
            }
        }
    
        kotlinOptions { jvmTarget = "1.8" }
    }
    
  3. 조각 또는 활동에서 가져오기를 다음으로 변경합니다.

    Androidx.activity를 가져옵니다.모형 보기

  4. 그러면 View Model을 만드는 코드는 다음과 같습니다.

    val viewModel: CalculatorViewModel by viewModels()
    

    대신에

    val viewModel = ViewModelProviders.of(this).get(CalculatorViewModel::class.java)
    

    viewModel 개체를 다음과 같이 사용합니다.

    val viewModel: CalculatorViewModel by viewModels()
    
    viewModel.newNumber.observe(this, Observer<String> { 
        stringResult -> newNumber.setText(stringResult) 
    })
    

    여기서 newNumer는 LiveData 개체입니다.

    활동 보기 모델을 공유하려는 조각에서 사용할 수 있습니다.

    val viewModel: CalculatorViewModel by activityViewModels()
    

이는 (사용되지 않음)에서 활동 인스턴스를 전달하는 것과 같습니다.ViewModelProviders.of()기능.

ViewModelProviders.of()가 더 이상 사용되지 않습니다.

이제 기본 ViewModelProvider를 처리하므로 ViewModelProvider 생성자를 직접 사용합니다.공장 역할.

 mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);

다음을 사용할 수 있습니다.

val viewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(MyViewModel::class.java)

android.arch.lifecycle:extensions:1.1.1부양 가족으로서

사실, 그것은 무엇입니까?ViewModelProviders.of()후드 아래에서 하는 방법은 무엇입니까?

@Deprecated
@NonNull
@MainThread
public static ViewModelProvider of(@NonNull Fragment fragment) {
    return new ViewModelProvider(fragment);
}

그것은 걸린다.Fragment를 합니다.ViewModelProvider대상을 지정하고 조각을 에 직접 전달합니다.ViewModelProvider 생성자

우리도 같은 방법으로 사용할 수 있습니다.

예: 이전:

OurViewModel mOurViewModel = ViewModelProviders.of(this).get(OurViewModel.class);

이후:

OurViewModel mOurViewModel = new ViewModelProvider(this).get(OurViewModel.class);

예 @Tarek, 더 이상 사용되지 않습니다.Android X에서 지금 사용:

val yourViewModel = ViewModelProvider.NewInstanceFactory().create(YourVideoModel::class.java)

당신이 비디오를 보는 경우에.Udacity생성할 위치GameViewModel사용되지 않는 코드를 작성하지 않으려면 다음을 대체하십시오.

viewModel = ViewModelProviders.of(this).get(GameViewModel::class.java)

다음 코드를 사용합니다.

viewModel = ViewModelProvider(this).get(GameViewModel::class.java)
  

그리고 가능한 한 빨리 독서로 돌아옵니다!!

설명서에 언급된 대로 사용자 ViewModelProviders.of() 대신 ViewModelProvider를 직접 사용합니다.

ViewModelProvider(this).get(XViewModel::class.java)

https://developer.android.com/reference/androidx/lifecycle/ViewModelProviders

사용 중android X그리고 이 문제도 있었습니다.

우선, 이러한 종속성을 사용자 환경에 추가해야 합니다.Gradle:

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

제 경우 $lifecycle_version은2.2.0-rc02

번째: 다음을 위한 가져오기ViewModelProvider다음과 같아야 합니다.

import androidx.lifecycle.ViewModelProvider

또한 아래 예와 같이 vView 모델을 초기화할 수 있습니다.

val viewModel = ViewModelProvider(this, YourFactoryInstace).get(MainViewModel::class.java)

val viewModel = ViewModelProvider(this).get(MainViewModel::class.java)

Kotlin을 사용하는 경우 속성 대리자를 사용할 수 있습니다.viewModels()다음과 같이:

val viewModel: YourViewModel by viewModels()

출처: https://forums.bignerdranch.com/t/solution-to-deprecated-method-viewmodelproviders-of/16833

사용:

YourViewModel yourViewModel = new ViewModelProvider.AndroidViewModelFactory(getApplication()).create(YourViewModel.class);

대신 다음을 사용할 수 있습니다.

viewModel= ViewModelProvider(this).get(YourViewModel::class.java)

괄호 안의 "this"는 귀하의 View Model 인스턴스의 소유자입니다.

저는 전문가는 아니지만 자바에서 제 문제를 해결한 코드 라인을 가지고 있습니다.이것이 누군가에게 도움이 되기를 바랍니다.

viewModel = 
new ViewModelProvider
.AndroidViewModelFactory(getApplication())
.create(ViewModel.class);

제가 말씀드린 것처럼, 저는 더 자세한 정보를 제공하고 싶지만, 이것은 저에게 이 문제를 해결해 주었습니다.

이 대답은 자바를 위한 것이지만 당신은 요점을 이해할 수 있습니다.ViewModelProvider는 다음과 같이 권장되지 않으므로 ViewModelProvider를 사용해야 합니다.

//Do not forget import it.
import androidx.lifecycle.AndroidViewModel;

ViewModelProvider.AndroidViewModelFactory(getApplication()).create(YourViewModel.class);

사용 예는 다음과 같습니다.

YourViewModel yourViewModel = new ViewModelProvider.AndroidViewModelFactory(getApplication()).create(YourViewModel.class);

또한 Gradle 종속성 업데이트도 잊지 마십시오.최신 버전은 여기에서 확인하십시오.

implementation 'androidx.lifecycle:lifecycle-viewmodel:2.2.0'
annotationProcessor 'androidx.lifecycle:lifecycle-compiler:2.2.0'

그러나 일부 답변에서는 이 솔루션을 권장하지만 저에게는 효과가 없었기 때문에 주의하십시오.

yourViewModel = new ViewModelProvider(this).get(YourViewModel.class);

이 방법을 사용했을 때 아래의 오류 메시지가 표시되었기 때문입니다.

원인: java.lang.런타임예외: com.canerkaseler.mvvmexample 클래스의 인스턴스를 만들 수 없습니다.모델 보기

단검을 사용하면 공장을 통과할 수 있습니다.

  MobileViewModel mobileViewModel = new ViewModelProvider(this,providerFactory).get(MobileViewModel.class);

나는 계속 시도했고 결국 코틀린에서 이 솔루션을 얻었고, 당신은 자바에서도 그것을 시도할 수 있을 것입니다.

기본 활동.kt

 val provider : ViewModelProvider = ViewModelProvider(this)
 val VM = provider.get(ViewModelClass::class.java)

빌드.그래들

implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.0"

라이프사이클 라이브러리의 현재 버전은 2.3.0이며, 현재 버전을 확인하려면 https://developer.android.com/jetpack/androidx/releases/lifecycle 을 참조하십시오.

저는 공장을 이용하고 있습니다.

ViewModelProvider.AndroidViewModelFactory
            .getInstance(getApplication())
            .create(DashboardViewModel.class);

다음에서 간단히

ViewModelProviders.of(이, 공급자.get)(MainActivityViewModel::class.java)

로.

ViewModelProvider(이, 공급자).get(MainActivityViewModel::class.java)

업데이트: 2022년 7월 20일

private lateinit var binding: FragmentHomeBinding
    private lateinit var homeMvvM : HomeViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        homeMvvM = ViewModelProvider(this)[HomeViewModel::class.java]

이것은 나에게 효과가 있습니다.

저도 같은 문제에 직면해 있었습니다.만약 아무 것도 작동하지 않는다면, 이 코드 조각을 당신의 생성에 시도하고 당신의 파일과 붐에 따라 편집하세요.

val model = ViewModelProvider(viewModelStore,ViewModelProvider.AndroidViewModelFactory.getInstance(application)).get(MainActivityViewModel::class.java)

모델 클래스만 변경하면 됩니다.

다음과 같은 것을 사용할 수 있습니다.

private  val sharedViewModel: SharedViewModel by viewModels(ownerProducer = { requireActivity() })


ownerProducer = { requireActivity() } // This is only required if you want to share same view model among different fragments.

Library of Lifecycle 2.3.1을 사용하고 있으며 build.gradle(모듈 레벨)에 아래와 같은 종속성을 추가합니다.

implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
implementation 'androidx.lifecycle:lifecycle-extensions-ktx:2.2.0'
implementation 'androidx.activity:activity-ktx:1.4.0'
implementation 'androidx.fragment:fragment-ktx:1.3.6'

아래와 같이 Kotlin 코드에서 viewModel()을 선언합니다.

import androidx.fragment.app.viewModels

private val cartViewModel: CartViewModel by viewModels()
//Activity ktx
implementation 'androidx.activity:activity-ktx:1.5.1'

//Fragment ktx
implementation 'androidx.fragment:fragment-ktx:1.5.1'

뷰 모델을 만드는 가장 간단한 방법:

class MyViewModel() : ViewModel() {

}

class SomeActivity:AppCompatActivity(){
  private val viewModel: MyViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_some)
}
}

생성자 인수가 있는 모형 보기:

class MyViewModel(list:List<String>) : ViewModel() {


 class Factory(list:List<String>) : ViewModelProvider.Factory {
        @Suppress("unchecked_cast")
        override fun <T : ViewModel> create(modelClass: Class<T>): T {
            return MyViewModel(list) as T
        }
    }
}
class SomeActivity:AppCompatActivity(){

  private val viewModel: MyViewModel by viewModels(){
MyViewModel.Factory(listOf<String>("a"))}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
}
}

build.gradle 모듈 수준에서 이 코드를 추가해 보십시오.

 android {
 kotlinOptions {
    freeCompilerArgs += [
        '-Xjvm-default=enable'
    ]
  }   
}

해보세요...

 LocationViewModel locationViewModel = new ViewModelProvider(this).get(LocationViewModel.class);

이 구현이 있는 경우

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

사용해 보십시오.viewModel = MainViewModel()

언급URL : https://stackoverflow.com/questions/53903762/viewmodelproviders-is-deprecated-in-1-1-0

반응형