Kotlin Android 扩展在库类型模块中不起作用

Jua*_* T. 5 android gradle kotlin kotlin-android-extensions

我正在尝试实现 kotlin android 扩展以使用 @Parcelize 注释,如果我在应用程序的模块('com.android.application')中实现它,它就可以正常工作,但是当我尝试在库类型中使用它时模块('com.android.library')它对我不起作用。

我的gradle配置如下:

Build.gradle // 应用程序

apply plugin: 'com.android.application'
apply plugin: 'jacoco'
apply plugin: 'io.fabric'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

apply plugin: 'kotlin-allopen'
apply plugin: 'androidx.navigation.safeargs'

allOpen {
  annotation 'com.juanlondono.app.soldi.testing.OpenClass'
}

androidExtensions {
  experimental = true
}

dependencies {
  implementation fileTree(dir: 'libs', include: ['*.jar'])

  // ------------------------- KOTLIN ------------------------- //
  implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.11"

 ... // Other Dependencies

}
Run Code Online (Sandbox Code Playgroud)

Build.gradle // 库

    apply plugin: 'com.android.library'
    apply plugin: 'kotlin-android'
    apply plugin: 'kotlin-android-extensions'

    dependencies {
      implementation fileTree(dir: 'libs', include: ['*.jar'])
    
      // ------------------------- KOTLIN ------------------------- //
      implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.11"
   
    ... // Other Dependencies
    }
Run Code Online (Sandbox Code Playgroud)

为了配置 kotlin android 扩展,我基于以下指南:Kotlinlang

在进行之前的配置后,我尝试实现 @Parcelize 注释,但它不起作用我收到未解析引用 Parcelize的消息

添加

androidExtensions {
   experimental = true
} 
Run Code Online (Sandbox Code Playgroud)

在库的gradle,出现如下错误:

Cannot invoke method get() on null object

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':app'.
> Could not resolve all dependencies for configuration ':app:prodDebugRuntimeClasspath'.
   > A problem occurred configuring project ':model'.
      > Failed to notify dependency resolution listener.
         > Cannot invoke method get() on null object
         > Cannot invoke method get() on null object
         > Cannot invoke method get() on null object
         > Cannot invoke method get() on null object
Run Code Online (Sandbox Code Playgroud)

目前,Parcelable 的实现是手动完成的。

更新

最近 kotlin 扩展被弃用,取而代之的是 kotlin-parcelize 以使项目工作,必须更改以下内容:

步骤 1:更新到最新的 kotlin 版本(1.4.20)或更新版本

STEP 2:apply plugin: 'kotlin-android-extensions' 用这个替换apply plugin: 'kotlin-parcelize'

第 2 步:从 android {} 中删除此代码

androidExtensions {
    experimental = true
}
Run Code Online (Sandbox Code Playgroud)

第 3 步:import kotlinx.android.parcel.Parcelize 用新导入替换旧导入import kotlinx.parcelize.Parcelize

Jua*_* T. 2

我刚刚排练了该版本Kotlin 1.3.50,它可以在以下配置下正常工作:

该项目的类型必须是com.android.applicationcom.android.library。就我而言,我正在使用类型的项目android.library

构建.gradle(库)

apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
  ...
}

androidExtensions {
  experimental = true
}

dependencies {
  ...
}
Run Code Online (Sandbox Code Playgroud)

模型类

import android.os.Parcelable
import kotlinx.android.parcel.Parcelize

@Parcelize
data class Test(val prop: String) : Parcelable
Run Code Online (Sandbox Code Playgroud)