IOS 上的 InvalidMutabilityException,在 Kotlin Multiplatform 中使用协程的可变变量
InvalidMutabilityException on IOS with mutable variables using coroutines in Kotlin Multiplatform
我把错误简化了,我只有这个class:
class TestClass{
private var string = "Hello"
fun testError() {
string= "It Works"
GlobalScope.launch(Dispatchers.Default) {
string = "Doesn't work"
}
}
}
如果我在主线程(在 IOS 上)启动 TestClass().testError(),它会抛出 InvalidMutabilityException(在行 --> 字符串 =“不工作”)。所以我认为在创建变量的线程以外的线程上更改变量可能不是一个好主意。所以我改成这样:
class TestClass{
private var string = "Hello"
fun testError() {
string= "It Works"
GlobalScope.launch(Dispatchers.Default) {
withContext(Dispatchers.Main) { string = "Doesn't work" }
}
}
}
但仍然报错:
kotlin.native.concurrent.InvalidMutabilityException: 冰冻com.example.project.TestClass@fe10a8
的变异尝试
顺便说一句。上面的两个代码都适用于 Android 端
Kotlin/Native 具有与 JVM 不同的线程模型。 TestClass
在 lambda 中捕获数据时被冻结。 string
赋值静默捕获父 TestClass
并冻结它。
查看以下内容:
我把错误简化了,我只有这个class:
class TestClass{
private var string = "Hello"
fun testError() {
string= "It Works"
GlobalScope.launch(Dispatchers.Default) {
string = "Doesn't work"
}
}
}
如果我在主线程(在 IOS 上)启动 TestClass().testError(),它会抛出 InvalidMutabilityException(在行 --> 字符串 =“不工作”)。所以我认为在创建变量的线程以外的线程上更改变量可能不是一个好主意。所以我改成这样:
class TestClass{
private var string = "Hello"
fun testError() {
string= "It Works"
GlobalScope.launch(Dispatchers.Default) {
withContext(Dispatchers.Main) { string = "Doesn't work" }
}
}
}
但仍然报错:
kotlin.native.concurrent.InvalidMutabilityException: 冰冻com.example.project.TestClass@fe10a8
的变异尝试顺便说一句。上面的两个代码都适用于 Android 端
Kotlin/Native 具有与 JVM 不同的线程模型。 TestClass
在 lambda 中捕获数据时被冻结。 string
赋值静默捕获父 TestClass
并冻结它。
查看以下内容: