Общая зависимость ktor Основная часть многоплатформенного проекта Android Studio не решена в среде IDE, но код выполняется

У меня проблема с IDE Android Studio при использовании зависимости ktor для набора исходных кодов commonMain с мультиплатформой kotlin. Проблема в том, что 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 в общем Основная часть общего кода в мультиплатформенном проекте Android Studio kotlin

Второй снимок экрана относится к классу KtorTest2, который точно такой же, как KtorTest выше, за исключением того, что он находится в папке androidMain общей папки в многоплатформенном проекте.

KtorTest2 в androidMain общего кода в мультиплатформенном проекте Android Studio kotlin

На этих изображениях вы можете видеть, что IDE жалуется на ktor в commonMain, но не на androidMain.


person borremcqueen    schedule 17.02.2021    source источник


Ответы (2)


Вам нужно только включить io.ktor:ktor-client-core в commonMain и фактическую реализацию механизма HTTP в желаемую цель. Если вы хотите использовать движок CIO в Android, просто включите io.ktor:ktor-client-cio в androidMain. Ktor автоматически выберет доступный HTTP-клиент, доступный для платформы. Вы можете обновить класс KtorTest следующим образом (обратите внимание на отсутствие спецификации движка):

class KtorTest {
    val client: HttpClient = HttpClient
}
person Webfreak    schedule 18.02.2021
comment
Понятно, но с подсветкой синтаксиса это не помогло. Я думаю, что с моим классом что-то не так - person borremcqueen; 08.03.2021
comment
Попробуй аннулировать кеш / перезапустить ide. - person Webfreak; 09.03.2021
comment
Аннулирование кеша и перезапуск не помогли. Интересно то, что это не проблема, когда я открываю проект client-mpp следующего примера кода в android studio github.com/ktorio/ktor-samples - person borremcqueen; 29.03.2021

Обновление kotlin-gradle-plugin до версии 1.4.31 в build.gradle.kts многоплатформенного проекта kotlin устранило эту проблему.

Дополнительную информацию см. В следующем ответе: https://stackoverflow.com/a/66913665/14635103

person borremcqueen    schedule 09.04.2021