带有 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
接口。
【讨论】:
我遇到了同样的问题,我试图将 ktor1.1.2
与不兼容的 kotlin 1.3.31
一起使用。我不得不将 ktor 升级到 1.1.5
。
你们怎么知道哪个版本兼容?我有同样的问题:(
@ArchieG.Quiñones 此时,最好使用 KotlinConf 应用程序或 Kotlin 官方教程作为事实来源,您也可以在 Kotlin 的 GitHub 中查看问题跟踪器以获取报告的问题最新版本。以上是关于带有 iOS 的 Kotlin Multiplatform:“使用未声明的类型 'KotlinCoroutineContext'”的主要内容,如果未能解决你的问题,请参考以下文章
在 Kotlin MultiPlatform 项目中未解决 iOS 依赖项
“带有接收器的 Lambda”:这个 Kotlin 构造是啥?