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
하는 것찾한을수없을 수 .of
의 ViewModel
.
제가 시도한 것:
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java)
방법의 은 " 따서메의이름은드소"입니다.create
View 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년 말의 것이었습니다.이 질문과 대답은 또한 이전 아키텍처 구성 요소 버전에 대한 것입니다.ViewModelProviders
Android 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'
}
그러면 라이브러리가 해당 클래스와 함께 "외부 라이브러리"에 표시되는 것을 볼 수 있습니다.
해당 클래스를 참조할 수 있습니다.
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
:
위의 사용되지 않는 코드를 대체하는 것이 무엇인지 생각해 보셨습니까?
사용하다ViewModelProviders
.
2020년 초 Google은 버전 2.2.0의 Androidx 라이프사이클 라이브러리에서 ViewModelProviders 클래스를 폐지했습니다.
ViewModelProvider를 사용하여 ViewModel의 인스턴스를 생성할 필요가 없습니다. 대신 조각 또는 활동 인스턴스를 ViewModelProvider 생성자에게 전달할 수 있습니다.
다음과 같은 코드를 사용하는 경우:
val viewModel = ViewModelProviders.of(this).get(CalculatorViewModel::class.java)
View Model Providers가 더 이상 사용되지 않는다는 경고 메시지가 표시됩니다.
사용되지 않는 라이브러리를 사용하지 않으려면 다음을 변경합니다.
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가 자동으로 포함되므로 종속성에 둘 다 지정할 필요가 없습니다.
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" } }
조각 또는 활동에서 가져오기를 다음으로 변경합니다.
Androidx.activity를 가져옵니다.모형 보기
그러면 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
'programing' 카테고리의 다른 글
마스터 분기를 업스트림으로 되돌리는 방법 (0) | 2023.08.17 |
---|---|
HTML/CSS의 전체 div에 대한 href 링크 (0) | 2023.08.17 |
봄 MVC에서 HandlerInterceptor.afterCompletion()이 응답 코드를 변경합니다. (0) | 2023.08.17 |
Twitter 부트스트랩:모달 대화 상자를 닫는 방법? (0) | 2023.08.17 |
오라클 sysdba 암호 복구 또는 변경 방법 (0) | 2023.08.17 |