Как использовать @Parcelize теперь, когда kotlin-android-extensions устарел?

#android #kotlin #annotations #parcelable

#Android #kotlin #аннотации #parcelable

Вопрос:

Как мне заменить annotation class Parcelize from package kotlinx.android.parcel на Parcelize, который не поступает из плагина kotlin-android-extensions?

Ответ №1:

Это должен быть новый плагин: https://plugins.gradle.org/plugin/org.jetbrains .kotlin.plugin.parcelize

При использовании Plugins DSL вы можете использовать идентификатор плагина в подмодулях. Убедитесь, что последний плагин Kotlin для Android доступен из пути к классу проекта.

 // project build.gradle
plugins {
    ..
    id "org.jetbrains.kotlin.android" version "1.4.20" apply false
}

// app build.gradle
plugins {
    ..
    id 'kotlin-parcelize'
}
 

При использовании kts вы можете написать ->

 // project build.gradle.kts
plugins {
    ..
    kotlin("android") version "1.4.20" apply false
}

// app build.gradle.kts
plugins {
    ..
    id("kotlin-parcelize")
}
 

— ИЛИ устаревшее приложение-плагин —

Шаг 1. Обновите до последней версии kotlin — 1.4.20 и замените

 apply plugin: 'kotlin-android-extensions' 

с помощью этого ->

 apply plugin: 'kotlin-parcelize'
 

Шаг 2. Удалите этот код из android {}

 androidExtensions {
    experimental = true
}
 

Шаг 3. Наконец, замените старый импорт ->

 import kotlinx.android.parcel.Parcelize
 

с новым импортом

 import kotlinx.parcelize.Parcelize
 

Комментарии:

1. Шаг 2 отсутствовал в других описаниях и исправил мою проблему, спасибо.

2. Я новичок в разработке Android и понятия kotlinx не имею, но parcelize у него нет подмодуля (?).

3. Для чего нужна эта project build.gradle часть? Кажется, это не обязательно

4. @FlorianWalther идентификатор «kotlin-parcelize» является частью плагина Kotlin для Android. Итак, вам нужно иметь плагин Kotlin Android в вашем пути к классу. Может быть, вы добавили его со старым синтаксисом classpath? Или у вас есть один модуль Android (модуль приложения) и добавлены все плагины только там. Тогда вам не нужно определять его в вашем проекте build.gradle gradle.

5. @G00fY Спасибо за разъяснение. У меня есть kotlin-android плагин, который по умолчанию добавляется в новый проект.

Ответ №2:

Сначала вам нужно будет добавить kotlin-parcelize плагин в свой модуль.

 plugins {
    ..
    id 'kotlin-parcelize'
}
 

Затем измените свой старый оператор импорта с

 import kotlinx.android.parcel.Parcelize
 

Для

 import kotlinx.parcelize.Parcelize
 

Редактировать (источник): https://proandroiddev.com/migrating-the-deprecated-kotlin-android-extensions-compiler-plugin-to-viewbinding-d234c691dec7

Комментарии:

1. Спасибо за ответ. Куда именно должен входить этот блок кода plugins {}? в файле gradle уровня проекта или в файле gradle уровня приложения?

2. нашел ответ. Он пока недоступен в текущей стабильной версии kotlin — medium.com/@drjacky/where-should-we-add-plugins-b85517b8a62f

3. @G00fY Как «kotlin-parcelize», так и «org.jetbrains. kotlin.plugin.parcelize’ работают для меня.

4. как насчет этой строки: путь к классу «org.jetbrains. kotlin:kotlin-android-extensions:$kotlin_version»

5. Пожалуйста, добавьте, что kotlin-parcelize плагин отделяется только после версии kotlin 1.4.20 и не будет найден ниже нее.

Ответ №3:

С помощью Groovy

build.gradle (уровень проекта)

 dependencies {
    // .... project level dependencies
    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files

    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20-RC"
}
 

build.gradle (уровень приложения)

 plugins {
    ...
    id 'kotlin-parcelize'
}
 

и класс данных

 import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
class User(
    val firstName: String, 
    val lastName: String, 
    val age: Int
): Parcelable
 

вы можете найти последнюю версию здесь https://plugins.gradle.org/plugin/org.jetbrains .kotlin.plugin.parcelize

Ответ №4:

  1. kotlin-android-extensions устарел, поэтому замените его на kotlin-parcelize
  2. Если для классов моделей используется аннотация @Parcelize, вам нужно заменить ее импорт из kotlinx.android.parcel.Parcelize для импорта kotlinx.parcelize.Parcelize

Ответ №5:

Просто обновите свой импорт

От: import kotlinx.android.parcel.Parcelize

к: import kotlinx.parcelize.Parcelize