我有一个问题与Android Studio IDE时使用ktor依赖与kotlin多平台的公共Main源集。问题是IDE不识别这种依赖关系,但是程序编译并运行良好。此外,在androidMain源集中,可以识别依赖关系。我见过类似问题的其他问题,但我没有见过程序编译和运行时有这个问题的人。
Gradle依赖关系
以下是项目共享文件夹中的build.gradle.kts。
kotlin {
android()
ios {
binaries {
framework {
baseName = "shared"
}
}
}
sourceSets {
val commonMain by getting {
dependencies {
implementation("io.ktor:ktor-client-core:1.5.1")
implementation("io.ktor:ktor-client-cio:1.5.1")
}
}
val androidMain by getting {
dependencies {
implementation("com.google.android.material:material:1.2.1")
implementation("io.ktor:ktor-client-android:1.5.1")
}
}
...
}
}
其中点表示其他源集的依赖关系,例如iosMain,它是空的。
在commonMain代码中,我有一个类KtorTest:
package com.example.myapplication222.shared
import io.ktor.client.*
import io.ktor.client.engine.cio.*
import io.ktor.client.request.*
class KtorTest {
val client: HttpClient = HttpClient(CIO)
suspend fun get(): String {
val res: String = client.get("http://www.7timer.info/bin/api.pl?lon=113.17&lat=23.09&product=astro&output=json")
return res
}
}
主要活动
在主活动中,我导入并使用KtorTest类来执行get请求。
package com.example.myapplication222.androidApp
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.myapplication222.shared.KtorTest
import kotlinx.coroutines.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var response = ""
val c = GlobalScope.launch {
response = get()
}
c.invokeOnCompletion {
println("***RESPONSE***");
println(response) }
}
suspend fun get(): String {
val a = KtorTest()
return a.get()
}
}
结果
程序构建、运行并打印出以下内容。
I/System.out: ***RESPONSE***
{
"product" : "astro" ,
"init" : "2021021700" ,
"dataseries" : [
{
"timepoint" : 3,
"cloudcover" : 4,
I/System.out: "seeing" : 6,
"transparency" : 2,
"lifted_index" : 15,
"rh2m" : 5,
"wind10m" : {
"direction" : "NE",
"speed" : 3
},
"temp2m" : 20,
"prec_type" : "none"
},
...
}
where the response is cut short for brevity
Android Studio的屏幕截图:
第一个屏幕截图是上面展示的KtorTest。
Android Studio kotlin多平台项目中共享代码的commonMain中的KtorTest
第二个屏幕截图是KtorTest2类,它与上面的KtorTest2完全相同,只是它位于多平台项目中共享文件夹的androidMain文件夹中。
AndroidStudio kotlin多平台项目中共享代码的androidMain中的KtorTest2
在这些图片中,您可以看到IDE在commonMain中抱怨ktor,但在androidMain中没有。
您只需要包含io。ktor:ktor客户机核心
commonMain
中的和所需目标中的实际HTTP引擎实现。如果您想在android中使用CIO引擎,只需包含
io即可。ktor:ktor客户cio
位于androidMain
中。Ktor将自动选择平台可用的HTTP客户端。您可以像这样更新KtorTest
类(请注意,没有发动机规格):
class KtorTest {
val client: HttpClient = HttpClient
}
将kotlin gradle插件更新为1.4。31号在建。格拉德尔。kotlin多平台项目的kts修复了此问题
有关更多详细信息,请参见以下答案:https://stackoverflow.com/a/66913665/14635103