ViewModelProviders устарела в 1.1.0

Глядя на документы Google для ViewModel, они показывают приведенный ниже пример кода о том, как получить ViewModel:

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

При использовании последней зависимости android.arch.lifecycle:extensions:1.1.1 такого класса ViewModelProviders.

Переходя к документации для ViewModelProviders, я увидел комментарий:

Этот класс устарел на уровне API 1.1.0. Используйте ViewModelProvider.AndroidViewModelFactory

Проблема, при попытке использовать ViewModelProvider.AndroidViewModelFactory, не может найти эквивалент of методе, чтобы получить экземпляр ViewModel.

Что я пытался сделать:

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

Отсюда и название метода create Каждый раз, когда я его вызываю, я получаю новый экземпляр ViewModel, что не является тем, что мне нужно.

Любые идеи, что замена устаревшего кода выше?

Ответ 1

При использовании последней зависимости android.arch.lifecycle:extensions:1.1.1 такого класса ViewModelProviders.

Да, есть. Чтобы продемонстрировать это:

  • Создайте новый проект в Android Studio 3.2.1 (с Kotlin, 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)
  }
}

Переходя к документации для ViewModelProviders, я увидел комментарий, говорящий: этот класс устарел на уровне API 1.1.0. Используйте ViewModelProvider.AndroidViewModelFactory

Этот комментарий находится под записью класса ViewModelProviders.DefaultFactory и относится к этому классу, а не к ViewModelProviders:

Documentation Screenshot

Любые идеи, что замена устаревшего кода выше?

Используйте ViewModelProviders.

Ответ 2

Я использую Lifecycle-extensions 2.2.0-alpha03 версия:

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

Это должно работать, используя конструктор ViewModelProvider.

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


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

Ответ 3

Как упомянул @FantasyFang в своем ответе, используйте последнюю версию для lifecycle:lifecycle-extensions, которая на данный момент является 2.2.0-alpha03. Поэтому вы должны добавить в свой файл build.gradle следующую строку:

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

Для тех, кто использует Java, чтобы решить эту проблему, передайте эти аргументы непосредственно конструктору ViewaModelProvider constructor:

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

Или, если вы не используете фабрику, просто используйте:

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

Не передавая свой заводской объект.

Ответ 4

Вероятно, вы можете просто использовать:

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

без необходимости добавлять android.arch.lifecycle:extensions:1.1.1 в качестве зависимости.

Ответ 5

Да, @Tarek, это устарело. Используйте сейчас с AndroidX:

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

Ответ 6

это должно работать так

 viewModel = ViewModelProviders.of([email protected]).get(MainActivityViewModel::class.java)

Ответ 7

Нет ничего о методе get который deprecated. Если вы будете следовать инструкциям разработчика Android, вы должны получить VM как это.

public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
    // Create a ViewModel the first time the system calls an activity onCreate() method.
    // Re-created activities receive the same MyViewModel instance created by the first activity.

    MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
    model.getUsers().observe(this, users -> {
        // update UI
    });
  }
}

Вот инструкции о том, как использовать ViewModels Вот инструкции о том, как настроить ваш проект с правильными зависимостями.

enter image description here

enter image description here