初始化IsolatedState会导致IlLegalStateException [英] Initializing IsolatedState results in IllegalStateException

查看:21
本文介绍了初始化IsolatedState会导致IlLegalStateException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在我的项目中使用IsolatedState中的Stately。例如,我有一个视图模型,其中包含一些要显示的数据结构。它是用数据结构实例初始化的,然后我尝试创建一个IsolatedState,以便能够应用用户操作和bg操作来从不同的线程变异相同的实例。

class ViewModel() {

    constructor(data: SomeData) : this() {
        println("Hey: ${data.isFrozen}")
        println(1)
        isolatedData = IsolateState { data }
        println(2)
    }

    lateinit private var isolatedData: IsolateState<SomeData>

}

输出为

Hey: false
1

,然后引发异常kotlin.IllegalStateException: Mutable state shouldn't be frozen。因此,在初始化IsolatedState之前,data似乎没有被冻结。我的初始化方式是否有问题?

推荐答案

我的初始化方式是否有问题?

是的。IsolateState的构造函数接受一个生产者lambda。该lambda应该返回一些可变的数据(即。未冻结)。Lambda本身运行在另一个线程中,该线程由管理IsolateState的运行时控制。需要冻结lambda才能在该线程上运行,这会冻结data

要使其起作用,它需要类似于以下内容:

    constructor(id: Int) : this() {
        isolatedData = IsolateState { SomeData(id) }
    }

lambda基本上需要创建可变类实例。不能将可变数据传递给IsolateState的实例。生产者lambda需要创建它。

这篇关于初始化IsolatedState会导致IlLegalStateException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆