kotlin.native.concurrent.InvalidMutabilityException:在 Kotlin Multiplatform (iOS) 中使用 ktor 时冻结 <ob
Posted
技术标签:
【中文标题】kotlin.native.concurrent.InvalidMutabilityException:在 Kotlin Multiplatform (iOS) 中使用 ktor 时冻结 <object> 的突变尝试【英文标题】:kotlin.native.concurrent.InvalidMutabilityException: mutation attempt of frozen <object> when using ktor in Kotlin Multiplatform (iOS) 【发布时间】:2019-05-14 06:39:59 【问题描述】:我正在尝试构建一个简单的 Kotlin 多平台应用程序,该应用程序调用互联网以使用 ktor 从互联网获取一些字符串。我从我编译的Kotlin conference app 中获取了一些函数,它在 android 和 ios 上都可以正常工作。
但是,在我的示例应用程序中,它仅适用于 Android,但在 iOS 上会返回
kotlin.native.concurrent.InvalidMutabilityException: mutation attempt of frozen <object>@c422ffe8
这是GitHub repository,下面是我的代码:
// src/commonMain/CoroutinePresenter.kt
open class CoroutinePresenter(
private val mainContext: CoroutineContext, // TODO: Use Dispatchers.Main instead when it will be supported on iOS
private val baseView: BaseView
): CoroutineScope
private val job = Job()
private val exceptionHandler = CoroutineExceptionHandler _, throwable ->
baseView.showError(throwable)
override val coroutineContext: CoroutineContext
get() = mainContext + job + exceptionHandler
open fun onDestroy()
job.cancel()
--
// src/commonMain/SamplePresenter.kt
class SamplePresenter(
val uiContext: CoroutineContext,
baseView: BaseView,
val sampleView: SampleView
) : CoroutinePresenter(uiContext, baseView)
private val client = HttpClient()
fun callSimpleApi()
try
GlobalScope.launch(uiContext)
getToolString()
catch (e: Exception)
sampleView.returnString(e.toString())
suspend fun getToolString() = client.get<String>
url("https://tools.ietf.org/rfc/rfc1866.txt")
override fun onDestroy()
super.onDestroy()
--
// src/iosMain/SampleIos.kt
object MainLoopDispatcher: CoroutineDispatcher()
override fun dispatch(context: CoroutineContext, block: Runnable)
NSRunLoop.mainRunLoop().performBlock
block.run()
--
// iosApp/iosApp/ViewController.swift
import app
class ViewController: UIViewController, SampleView, BaseView
private lazy var presenter: SamplePresenter = SamplePresenter(
uiContext: MainLoopDispatcher(),
baseView: self,
sampleView: self
)
()
@IBOutlet weak var label: UILabel!
func showError(error: KotlinThrowable)
print(error.message)
func returnString(result: String)
label.text = result
print(result)
override func viewDidLoad()
super.viewDidLoad()
print("helo")
presenter.callSimpleApi()
【问题讨论】:
【参考方案1】:原来是 Kotlin 版本 1.3.11
造成了麻烦。我已将其降级为1.3.10
,它工作得非常好。 ktor 将在下一个次要版本中收到修复。
来源 - Kotlin Slack,多平台频道。
【讨论】:
以上是关于kotlin.native.concurrent.InvalidMutabilityException:在 Kotlin Multiplatform (iOS) 中使用 ktor 时冻结 <ob的主要内容,如果未能解决你的问题,请参考以下文章