Ошибка компилятора при переходе в библиотеку androidx.lifecycle 2.8.0

Я использую:

implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0'
annotationProcessor 'androidx.lifecycle:lifecycle-common-java8:2.7.0'

библиотеки в моем проекте Android Java. Если я попытаюсь переместить его в версию 2.8.0, у меня появится сообщение от компилятора:

ViewModelProvider(androidx.lifecycle.viewmodel.ViewModelProviderImpl) has private access in 'androidx.lifecycle.ViewModelProvider.

ОБНОВЛЯТЬ: Благодаря @IanHannibalLake я заменил устаревшую библиотеку. implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' с implementation 'androidx.lifecycle:lifecycle-process:2.7.0' и теперь я могу скомпилировать проект с версией библиотеки 2.7.0 в конфигурации:

implementation 'androidx.lifecycle:lifecycle-process:2.7.0'  
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0'
annotationProcessor 'androidx.lifecycle:lifecycle-common-java8:2.7.0'

Но попытка скомпилировать с версиями 2.8.0 выдает ту же ошибку компилятора в строке:

SearchListViewModel viewModel = new ViewModelProvider(this, viewModelFactory).get(SearchListViewModel.class);

Какое изменение было сделано в lifecycle библиотеках версии 2.7.0, что не позволяет мне скомпилировать проект следующей версией 2.8.0!?

ОБНОВЛЕНИЕ 2: Я обнаружил новую ошибку ViewModel 2.8.0: конструктор имеет частный доступ в ViewModelProvider с тем же вопросом.

Ошибка исчезнет, ​​когда вы перестанете использовать давно устаревшую зависимость lifecycle-extensions? Вам вообще не следует использовать эту зависимость.

ianhanniballake 31.05.2024 06:13

"долго"? Что это значит?

isabsent 31.05.2024 06:37

Что-то, что «давно устарело», означает, что оно устарело уже 4 с половиной года.

ianhanniballake 31.05.2024 06:38

@ianhanniballake Да, я упустил тот момент, когда этот пакет устарел. Я заменил его на implementation androidx.lifecycle:lifecycle-process:2.8.0, но вышеупомянутая ошибка компилятора все еще сохраняется. Я не могу понять, какой пакет нужно добавить, чтобы удовлетворить все зависимости.

isabsent 31.05.2024 08:20

@ianhanniballake После вышеупомянутой замены я могу скомпилировать конфигурацию annotationProcessor 'androidx.lifecycle:lifecycle-common-java8:2.7.0'implementation 'androidx.lifecycle:lifecycle-process:2.7.0'implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.7.0'implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0', но не с 2.8.0 :( Ошибка компилятора та же.

isabsent 31.05.2024 08:43

@ianhanniballake Я нашел новую ошибку в ViewModel 2.8.0: конструктор имеет частный доступ в ViewModelProvider с тем же вопросом.

isabsent 31.05.2024 10:43
0
6
553
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ошибка возникает из-за того, что библиотека жизненного цикла Android теперь является многоплатформенным проектом Kotlin, и разрешение зависимостей Gradle выбирает вариант jvm вместо варианта Android. Это происходит только с проектами, в которых не применяется плагин gradle kotlin-android!

Проблема в том, что атрибут варианта «org.jetbrains.kotlin.platform.type» не запрашивается, и поэтому gradle выбирает вариант модели жизненного цикла jvm. Когда вы добавляете плагин kotlin-android, атрибуту автоматически присваивается значение «androidJvm». Дополнительную информацию об атрибутах вариантов градиента см. https://docs.gradle.org/current/userguide/variant_attributes.html

Вы можете отладить это с помощью следующей команды:

gradlew -q app:dependencyInsight --dependency lifecycle-viewmodel --configuration debugAndroidCompileClasspath

Это ошибка, и Google должен ее исправить. Вероятно, установив для варианта «org.gradle.jvm.environment» значение «android». Обходной путь может выглядеть так, но я не эксперт по Gradle, и должно быть лучшее решение.

    implementation("androidx.lifecycle:lifecycle-viewmodel")
    constraints {
        def platformTypeArgument = Attribute.of("org.jetbrains.kotlin.platform.type",  String)
        implementation("androidx.lifecycle:lifecycle-viewmodel:2.8.1") {
            because "The wrong dependency is picked"
            attributes {
                attribute(platformTypeArgument, "androidJvm")
            }
        }
        implementation("androidx.lifecycle:lifecycle-runtime:2.8.1") {
            because "The wrong dependency is picked"
            attributes {
                attribute(platformTypeArgument, "androidJvm")
            }
        }
}

ОБНОВЛЯТЬ:

Я обнаружил следующую ошибку при написании https://issuetracker.google.com/issues/328687152, что по сути является той же проблемой. Просто обновите плагин Android Gradle до версии 8.4.0, и проблема будет решена.

Спасибо! Ваш код Gradle работает, и теперь я могу скомпилировать его с версией библиотеки 2.8.x! Можете ли вы написать свое решение в трекере ошибок Issuetracker.google.com/issues/341801011 ?

isabsent 11.06.2024 10:25

для проекта Java удалите:

implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:X.X.X'

это должно выглядеть так:

implementation 'androidx.lifecycle:lifecycle-common-jvm:2.8.3'  
implementation 'androidx.lifecycle:lifecycle-process:2.8.3'  
implementation 'androidx.lifecycle:lifecycle-viewmodel-android:2.8.3'

Этот ответ почти помог, проблема с компиляцией исчезла, но вместо этого появилось множество ошибок «Дублированный класс».

ievgen 16.07.2024 17:07

Другие вопросы по теме