# 状态发布与读取

状态是可以持续读取的当前值。飞块收到 `states.publish()` 后保存最新快照，再把它交给有读取权限的流程或超级块。

## 状态身份

状态由发布插件、来源 ID 和作用域目标共同定位。例如，全局音量只需要插件与来源 ID；计数器实例还需要设备、屏幕和块 ID。两个计数器使用同一个来源声明，但目标不同，因此保存不同的值。

发布时，宿主检查来源属于当前插件，并检查目标与声明的作用域一致。作用域字段和允许的组合见 [stateSources](../../reference/states.md)。

## 读取

`visibility` 控制值出现在哪些位置。流程可见的状态可以成为表达式积木；超级块可见的状态可以作为页面快照。超级块通过 `stateSource` 引用来源，并由 `readAccess.widgets` 允许读取。实例来源和同类型共享来源还会检查超级块类型是否匹配。

Schema 的类型、说明和枚举名称也会提供给编辑器。比如，字符串值 `muted` 可以显示为“已静音”，让用户选择可读的名称，运行时仍比较原始值。

## 快照与清理

后一次发布替换前一次快照。来源尚未发布、插件停止或来源失效时，读取结果表示状态不可用；页面收到 `null`，可以显示占位内容。

插件状态保存在运行内存中。需要重启后恢复时，由插件保存业务数据，并在启动时重新发布。`lifetime` 用于确定清理时机，不会自动把值写入磁盘。生命周期字段见 [StateSource.lifetime](../../reference/states.md#statesource-lifetime)。
