ViewModelProviders устарела в 1.1.0 - PullRequest
0 голосов
/ 23 декабря 2018

Глядя на Документы 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, а это не то, что мне нужно.

Есть идеи, как заменить устаревший код выше?

Ответы [ 7 ]

0 голосов
/ 09 августа 2019

Я использую 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)
0 голосов
/ 14 августа 2019

Как упомянул @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.java);

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

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

Не передавая объект фабрики.

0 голосов
/ 24 июля 2019

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

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

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

0 голосов
/ 11 апреля 2019

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

val yourViewModel = ViewModelProvider.NewInstanceFactory().create(YourVideoModel::class.java)
0 голосов
/ 23 декабря 2018

В методе 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's 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

0 голосов
/ 23 декабря 2018

При использовании последней зависимости 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.

0 голосов
/ 23 декабря 2018

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

 viewModel = ViewModelProviders.of(this@MainActivity).get(MainActivityViewModel::class.java)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...