带有 iOS 的 Kotlin Multiplatform:“使用未声明的类型 'KotlinCoroutineContext'”

Posted

技术标签:

【中文标题】带有 iOS 的 Kotlin Multiplatform:“使用未声明的类型 \'KotlinCoroutineContext\'”【英文标题】:Kotlin Multiplatform with iOS: "Use of undeclared type 'KotlinCoroutineContext'"带有 iOS 的 Kotlin Multiplatform:“使用未声明的类型 'KotlinCoroutineContext'” 【发布时间】:2019-06-14 23:25:40 【问题描述】:

我正在尝试在 ios 上使用 Kotlin 多平台代码(使用 Ktor 和 Kotlin 协程)。框架生成正确,可以毫无问题地调用一些公开的类/方法。但是,如果我尝试添加以下内容(例如在 https://github.com/JetBrains/kotlinconf-app/blob/master/konfios/konfswift/ui/UI.swift 中所做的那样)。我得到“使用未声明的类型 'KotlinCoroutineContext”(我在 SharedCode.h 中看到它不存在)

import Foundation
import UIKit
import SharedCode


public class CoroutineDispatcher: Kotlinx_coroutines_core_nativeCoroutineScope 
    override public func dispatch(context: KotlinCoroutineContext, block: Kotlinx_coroutines_core_nativeRunnable) 
        DispatchQueue.main.async 
            block.run()
        
    

共享代码的 gradle 文件包括以下内容(我使用 Kotlin 1.3.11、Ktor 1.0.1 和 Coroutines 1.0.1 以及 Gradle 4.7)

    commonMain.dependencies 
        implementation "org.jetbrains.kotlin:kotlin-stdlib-common:$Versions.kotlin"
        implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$Versions.kotlinCoroutines"
        implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$Versions.kotlinxSerialization"

        implementation "io.ktor:ktor-client-core:$Versions.ktor"
        implementation "io.ktor:ktor-client-json:$Versions.ktor"

    

    androidMain.dependencies 
        implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$Versions.kotlin"
        implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$Versions.kotlinCoroutines"

        implementation "io.ktor:ktor-client-core-jvm:$Versions.ktor"
        implementation "io.ktor:ktor-client-json-jvm:$Versions.ktor"
    

    iOSMain.dependencies 
        implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-native:$Versions.kotlinCoroutines"
        implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:$Versions.kotlinxSerialization"

        implementation "io.ktor:ktor-client-ios:$Versions.ktor"
        implementation "io.ktor:ktor-client-core-ios:$Versions.ktor"
        implementation "io.ktor:ktor-client-json-ios:$Versions.ktor"
    

我怀疑这个问题可能是这些符号没有显式暴露(也尝试使用 api 而不是 implementation 来处理协程依赖关系,但这没有帮助)。

这是我目前所拥有的:https://github.com/joreilly/galway-bus-android/tree/kotlin_native

更新

尝试了新发布的 Kotlin v1.3.20,但现在得到了关注

> Task :SharedCode:linkMainDebugFrameworkIOS
warning: skipping /Users/jooreill/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-ios_debug_ios_x64/1.0.1/7ac4ac71743dbff041cc51a117e1732a9133d3b8/ktor-client-ios.klib. The abi versions don't match. Expected '[5]', found '2'
warning: the compiler versions don't match either. Expected '[1.1.1]', found '1.0.2-release-4769'
error: compilation failed: Could not find "/Users/jooreill/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-ios_debug_ios_x64/1.0.1/7ac4ac71743dbff041cc51a117e1732a9133d3b8/ktor-client-ios.klib" in [/Users/jooreill/devroot/github/galway-bus-android/SharedCode, /Users/jooreill/.konan/klib, /Users/jooreill/.konan/kotlin-native-macos-1.1.1/klib/common, /Users/jooreill/.konan/kotlin-native-macos-1.1.1/klib/platform/ios_x64].
``

【问题讨论】:

我尝试使用 Kotlin 1.3.20 EAP,它似乎提供了从多平台 gradle 文件中公开符号等的能力,但遇到了关注 github.com/ktorio/ktor/issues/848 使用export 新功能的示例 - github.com/ilmat192/kotlin-native-gradle-samples/blob/master/… 【参考方案1】:

我在你的更新中遇到了同样的问题

The abi versions don't match. Expected '[5]', found '2'1

基本上,使用 Kotlin 1.3.20,需要将 Ktor 升级到 1.1.2,然后需要 Gradle 4.10 才能使用最新的 Kotlin 本机。那是因为 Gradle 元数据

在那次更新之前,我开始有一个新问题来构建关于 Kotlin 序列化器的 iOS 工件:

error: compilation failed: Can’t locate polymorphic serializer definition

为了解决这个问题,我从类中删除了@Serializable 注释,并提供了分离的KSerializer 接口。

【讨论】:

我遇到了同样的问题,我试图将 ktor 1.1.2 与不兼容的 kotlin 1.3.31 一起使用。我不得不将 ktor 升级到 1.1.5 你们怎么知道哪个版本兼容?我有同样的问题:( @ArchieG.Quiñones 此时,最好使用 KotlinConf 应用程序或 Kotlin 官方教程作为事实来源,您也可以在 Kotlin 的 GitHub 中查看问题跟踪器以获取报告的问题最新版本。

以上是关于带有 iOS 的 Kotlin Multiplatform:“使用未声明的类型 'KotlinCoroutineContext'”的主要内容,如果未能解决你的问题,请参考以下文章

在 Kotlin MultiPlatform 项目中未解决 iOS 依赖项

带有 Proguard 的 Kotlin 反射失败

“带有接收器的 Lambda”:这个 Kotlin 构造是啥?

带有片段的 Kotlin

使用带有 Kotlin 的 CameraKit 时应用程序崩溃

带有 Spring Boot 2.0 @ConfigurationProperties 的 Kotlin 无法正常工作