微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

IDE 中未解决 Android Studio 多平台项目的 commonMain 中的 ktor 依赖项,但代码运行

如何解决IDE 中未解决 Android Studio 多平台项目的 commonMain 中的 ktor 依赖项,但代码运行

在将 ktor 依赖项用于具有 kotlin 多平台的 commonMain 源集时,我遇到了 Android Studio IDE 的问题。问题是 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 类来执行获取请求。

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。

KtorTest in commonMain of shared code in Android Studio kotlin multiplatform project

第二张截图是KtorTest2类,与上面的KtorTest完全一样,只是它位于多平台项目中共享文件夹的androidMain文件夹中。

KtorTest2 in androidMain of shared code in Android Studio kotlin multiplatform project

在这些图像中,您可以看到 IDE 在 commonMain 中抱怨 ktor,但在 androidMain 中没有。

解决方法

您只需要在 io.ktor:ktor-client-core 中包含 commonMain 并在所需目标中包含实际的 HTTP 引擎实现。如果您想在 android 中使用 CIO 引擎,只需在 io.ktor:ktor-client-cio 中包含 androidMain。 Ktor 会自动为平台选择可用的 HTTP 客户端。您可以像这样更新 KtorTest 类(注意缺少引擎规范):

class KtorTest {
    val client: HttpClient = HttpClient
}
,

在 kotlin 多平台项目的 build.gradle.kts 中将 kotlin-gradle-plugin 更新到 1.4.31 解决了这个问题

有关详细信息,请参阅以下答案:https://stackoverflow.com/a/66913665/14635103

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。