Я использую:
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 с тем же вопросом.
"долго"? Что это значит?
Что-то, что «давно устарело», означает, что оно устарело уже 4 с половиной года.
@ianhanniballake Да, я упустил тот момент, когда этот пакет устарел. Я заменил его на implementation androidx.lifecycle:lifecycle-process:2.8.0
, но вышеупомянутая ошибка компилятора все еще сохраняется. Я не могу понять, какой пакет нужно добавить, чтобы удовлетворить все зависимости.
@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
:( Ошибка компилятора та же.
@ianhanniballake Я нашел новую ошибку в ViewModel 2.8.0: конструктор имеет частный доступ в ViewModelProvider с тем же вопросом.
Ошибка возникает из-за того, что библиотека жизненного цикла 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 ?
для проекта 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'
Этот ответ почти помог, проблема с компиляцией исчезла, но вместо этого появилось множество ошибок «Дублированный класс».
Ошибка исчезнет, когда вы перестанете использовать давно устаревшую зависимость
lifecycle-extensions
? Вам вообще не следует использовать эту зависимость.