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 中获取了一些函数,它在 androidios 上都可以正常工作。

但是,在我的示例应用程序中,它仅适用于 Android,但在 iOS 上会返回

kotlin.native.concurrent.InvalidMutabilityException: mutation attempt of frozen &lt;object&gt;@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的主要内容,如果未能解决你的问题,请参考以下文章