初始化 IsolatedState 导致 IllegalStateException

Initializing IsolatedState results in IllegalStateException

我正在尝试在我的项目中使用 Stately 中的 IsolatedState。例如。我有一个视图模型,其中包含一些要显示的数据结构。它是用该数据结构实例初始化的,然后我试图创建一个 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。所以好像data在初始化IsolatedState之前没有被冻结。我初始化它的方式有问题吗?

Is something wrong in the way I am initializing it?

是的。 IsolateState 的构造函数采用生产者 lambda。该 lambda 应该 return 一些可变的数据(即未冻结)。 lambda 本身 运行 在另一个线程中,该线程由管理 IsolateState 的 运行time 控制。该 lambda 需要在该线程上冻结为 运行,这会冻结 data.

要使其正常工作,它需要看起来更像以下内容:

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

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