Android Studio не может найти модуль kotlinx, сгенерированный из макета - PullRequest
0 голосов
/ 03 июля 2018

Я использую стандартные расширения Kotlin для Android, чтобы ссылаться на View s, определенные в XML макета с использованием идентификаторов, введенных в kotlinx.android.synthetic.main.activity_main. Я могу скомпилировать свой проект как из Android Studio, так и из CLI, поэтому эти ссылки, кажется, разрешены правильно; однако в Android Studio оператор импорта отображается как неразрешенный, и поэтому ни один из введенных идентификаторов не работает.

Мой build.gradle выглядит следующим образом:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-platform-android'
apply plugin: 'kotlin-android-extensions'

buildscript {
    ext.kotlin_version = '1.2.50'

    repositories {
        mavenCentral()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

androidExtensions {
    experimental = true
}

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.example"
        minSdkVersion 19
        targetSdkVersion 27
        versionCode 2
        versionName "0.3.0"
        vectorDrawables.useSupportLibrary = true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation "org.jetbrains.anko:anko-sdk15:0.8.3"
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.0'
    implementation 'com.android.support:design:27.1.1'
    implementation 'com.android.support:support-v4:27.1.1'
    implementation 'com.android.support:support-vector-drawable:27.1.1'
    implementation 'org.apache.commons:commons-io:1.3.2'
    expectedBy project(':engine')
    implementation project(':dialogue')
    implementation 'com.android.support:cardview-v7:27.1.1'
    implementation 'com.github.daniel-stoneuk:material-about-library:2.3.0'
}

1 Ответ

0 голосов
/ 06 июля 2018

Мне удалось обойти эту проблему, создав отдельный модуль библиотеки Android только с битами, специфичными для платформы (и, что важно, без использования kotlinx), а затем импортировав их в основной модуль приложения. Это означает, что модулю основного приложения больше не нужно использовать kotlin-platform-android, а вместо него можно просто указать kotlin-android.

Итак, в итоге, в модуле, содержащем специфичные для платформы биты:

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

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    expectedBy project(':engine')
}

и в основном модуле:

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

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
    kotlinOptions {
        freeCompilerArgs = ["-Xmulti-platform"]
    }
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation project(':engine-android')
}

Обратите внимание, что нам все еще нужно передать -Xmulti-platform компилятору Kotlin, чтобы иметь возможность связываться с :engine-android; но мы используем плагин vanilla kotlin-android, который работает нормально с kotlin-android-extensions.

...