将 Ktor 添加到 Kotlin Multiplatform Mobile 导致未解析的引用:HttpClient
Adding Ktor To Kotlin Multiplatform Mobile results in Unresolved reference: HttpClient
我无法让 Ktor 在 KMM 项目中工作,我只是在尝试引用任何 Ktor classes 时遇到 Unresolved reference: HttpClient
错误。如果我尝试手动添加 ktor import,它会显示 Unresolved reference io
。 Kermit
等其他依赖项解决得很好,似乎只是 Ktor 有问题。这是我重现的简单步骤:
在 Android Studio(我已经尝试过 4.1.3 和 4.2 Beta 6)中,我转到文件 -> 新建 -> KMM 应用程序。
在共享模块build.gradle.kts中我添加了ktor客户端的依赖:
val commonMain by getting {
dependencies {
implementation("io.ktor:ktor-client-core:1.5.2")
}
}
- 在 commonMain 的
Greeting
class 中,我尝试创建一个 HttpClient,就像它在 Ktor 文档 https://kotlinlang.org/docs/mobile/use-ktor-for-networking.html#select-an-engine: 中所说的那样
class Greeting {
val httpClient: HttpClient = HttpClient()
fun greeting(): String {
return "Hello, ${Platform().platform}!"
}
}
我得到 Unresolved reference: HttpClient
。 ktor 导入不起作用。
我尝试过的事情:
- 同时添加 Android 和 iOS 客户端依赖项。
- 按照此处的建议将 enableFeaturePreview("GRADLE_METADATA") 添加到 settings.gradle.kts:
- 正在清理,与gradle同步,使现金无效并重启,关闭AS并重新打开,构建项目。
我真的不知道为什么这不起作用,这似乎是最简单的设置。这是我的 build.gradle 文件和设置文件(它们是从新 KMM 项目向导自动生成的)
共享模块build.gradle.kts
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
plugins {
kotlin("multiplatform")
id("com.android.library")
}
kotlin {
android()
ios {
binaries {
framework {
baseName = "shared"
}
}
}
sourceSets {
val commonMain by getting {
dependencies {
implementation("io.ktor:ktor-client-core:1.5.2")
}
}
val commonTest by getting {
dependencies {
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))
}
}
val androidMain by getting {
dependencies {
implementation("com.google.android.material:material:1.2.1")
}
}
val androidTest by getting {
dependencies {
implementation(kotlin("test-junit"))
implementation("junit:junit:4.13")
}
}
val iosMain by getting
val iosTest by getting
}
}
android {
compileSdkVersion(29)
sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
defaultConfig {
minSdkVersion(24)
targetSdkVersion(29)
}
}
val packForXcode by tasks.creating(Sync::class) {
group = "build"
val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
val sdkName = System.getenv("SDK_NAME") ?: "iphonesimulator"
val targetName = "ios" + if (sdkName.startsWith("iphoneos")) "Arm64" else "X64"
val framework = kotlin.targets.getByName<KotlinNativeTarget>(targetName).binaries.getFramework(mode)
inputs.property("mode", mode)
dependsOn(framework.linkTask)
val targetDir = File(buildDir, "xcode-frameworks")
from({ framework.outputDirectory })
into(targetDir)
}
tasks.getByName("build").dependsOn(packForXcode)
项目build.gradle.kts
buildscript {
repositories {
gradlePluginPortal()
jcenter()
google()
mavenCentral()
}
dependencies {
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.10")
classpath("com.android.tools.build:gradle:4.0.1")
}
}
allprojects {
repositories {
google()
jcenter()
mavenCentral()
}
}
settings.gradle.kts
pluginManagement {
repositories {
google()
jcenter()
gradlePluginPortal()
mavenCentral()
}
}
rootProject.name = "core"
include(":androidApp")
include(":shared")
我在这里回答了这个问题:
基本上将根 org.jetbrains.kotlin:kotlin-gradle-plugin
从 1.4.10 更新到 1.4.31 build.gradle.kts
解决了我的问题。
这是我的 build.gradle.kts
文件的样子:
buildscript {
repositories {
gradlePluginPortal()
jcenter()
google()
mavenCentral()
}
dependencies {
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.31")
classpath("com.android.tools.build:gradle:4.2.0-beta06")
classpath("com.squareup.sqldelight:gradle-plugin:1.4.4")
}
}
allprojects {
repositories {
google()
jcenter()
mavenCentral()
}
}
我无法让 Ktor 在 KMM 项目中工作,我只是在尝试引用任何 Ktor classes 时遇到 Unresolved reference: HttpClient
错误。如果我尝试手动添加 ktor import,它会显示 Unresolved reference io
。 Kermit
等其他依赖项解决得很好,似乎只是 Ktor 有问题。这是我重现的简单步骤:
在 Android Studio(我已经尝试过 4.1.3 和 4.2 Beta 6)中,我转到文件 -> 新建 -> KMM 应用程序。
在共享模块build.gradle.kts中我添加了ktor客户端的依赖:
val commonMain by getting {
dependencies {
implementation("io.ktor:ktor-client-core:1.5.2")
}
}
- 在 commonMain 的
Greeting
class 中,我尝试创建一个 HttpClient,就像它在 Ktor 文档 https://kotlinlang.org/docs/mobile/use-ktor-for-networking.html#select-an-engine: 中所说的那样
class Greeting {
val httpClient: HttpClient = HttpClient()
fun greeting(): String {
return "Hello, ${Platform().platform}!"
}
}
我得到 Unresolved reference: HttpClient
。 ktor 导入不起作用。
我尝试过的事情:
- 同时添加 Android 和 iOS 客户端依赖项。
- 按照此处的建议将 enableFeaturePreview("GRADLE_METADATA") 添加到 settings.gradle.kts:
- 正在清理,与gradle同步,使现金无效并重启,关闭AS并重新打开,构建项目。
我真的不知道为什么这不起作用,这似乎是最简单的设置。这是我的 build.gradle 文件和设置文件(它们是从新 KMM 项目向导自动生成的)
共享模块build.gradle.kts
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
plugins {
kotlin("multiplatform")
id("com.android.library")
}
kotlin {
android()
ios {
binaries {
framework {
baseName = "shared"
}
}
}
sourceSets {
val commonMain by getting {
dependencies {
implementation("io.ktor:ktor-client-core:1.5.2")
}
}
val commonTest by getting {
dependencies {
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))
}
}
val androidMain by getting {
dependencies {
implementation("com.google.android.material:material:1.2.1")
}
}
val androidTest by getting {
dependencies {
implementation(kotlin("test-junit"))
implementation("junit:junit:4.13")
}
}
val iosMain by getting
val iosTest by getting
}
}
android {
compileSdkVersion(29)
sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
defaultConfig {
minSdkVersion(24)
targetSdkVersion(29)
}
}
val packForXcode by tasks.creating(Sync::class) {
group = "build"
val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
val sdkName = System.getenv("SDK_NAME") ?: "iphonesimulator"
val targetName = "ios" + if (sdkName.startsWith("iphoneos")) "Arm64" else "X64"
val framework = kotlin.targets.getByName<KotlinNativeTarget>(targetName).binaries.getFramework(mode)
inputs.property("mode", mode)
dependsOn(framework.linkTask)
val targetDir = File(buildDir, "xcode-frameworks")
from({ framework.outputDirectory })
into(targetDir)
}
tasks.getByName("build").dependsOn(packForXcode)
项目build.gradle.kts
buildscript {
repositories {
gradlePluginPortal()
jcenter()
google()
mavenCentral()
}
dependencies {
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.10")
classpath("com.android.tools.build:gradle:4.0.1")
}
}
allprojects {
repositories {
google()
jcenter()
mavenCentral()
}
}
settings.gradle.kts
pluginManagement {
repositories {
google()
jcenter()
gradlePluginPortal()
mavenCentral()
}
}
rootProject.name = "core"
include(":androidApp")
include(":shared")
我在这里回答了这个问题:
基本上将根 org.jetbrains.kotlin:kotlin-gradle-plugin
从 1.4.10 更新到 1.4.31 build.gradle.kts
解决了我的问题。
这是我的 build.gradle.kts
文件的样子:
buildscript {
repositories {
gradlePluginPortal()
jcenter()
google()
mavenCentral()
}
dependencies {
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.31")
classpath("com.android.tools.build:gradle:4.2.0-beta06")
classpath("com.squareup.sqldelight:gradle-plugin:1.4.4")
}
}
allprojects {
repositories {
google()
jcenter()
mavenCentral()
}
}