用途
该技能讨论共享会话中“跟随者”(follower)的传输控制应如何实现。核心主张是:跟随不是被驱动。跟随者拥有自己的停止按钮,暂停是本地且静默的;按下播放时,应询问会话当前在哪里,而不是恢复本地播放位置。
主要能力
- 跟随者的本地控制属于自己,暂停时不发布任何状态,避免一个人的停止按钮停掉整个会话。
- 恢复时发出的是请求(requestSync),而非命令,通过普通应用路径应用中继返回的答案。
- 将恢复后的答案视为完整状态(当前条目、位置和队列),而非仅传输更新。
- 对本地传输流先去重(distinctUntilChanged),再决定是否触发追赶。
- 角色检查(isSource/isHost)放在暂停与恢复分支之前,而非之内。
- 仅共享轴是共享的;音量、输出设备、字幕、显示设置等本地设置不属于分歧。
使用方式
文档给出 Kotlin 代码片段,展示收集器如何映射本地运行标志并去重:
// adapted — names generalized; the collector maps the local running flag and dedupes it
.collect { locallyRunning ->
val session = repository.session.value
if (!session.inSession || session.isSource || applyingRemote) return@collect
if (!locallyRunning) return@collect // paused locally: leave the session running
repository.requestSync() // resumed: ask where the session is NOW
}
并给出验证用的 grep 命令,用于检查跟随者本地传输收集器是否退出而非纠正,以及发布者是否真正按源角色门控:
grep -rn -B2 -A14 -E "\.(controlState|transportState)\b" --include="*.kt" . | grep -v "/build/" \
| grep -E "isHost|isSource|applyingRemote|requestSync|\.play\(\)|\.pause\(\)|return@collect"
grep -rn -B1 -A2 "return@collect" --include="*.kt" . | grep -v "/build/" \
| grep -E "!.*is(Host|Source)|is(Host|Source) *\|\|"
grep -rnE "if \(.*\bis(Host|Hosting|Source)\b.*\) *[a-z][A-Za-z]*\(" --include="*.kt" . | grep -v "/build/"
行为验证(双客户端):
- 在跟随者上暂停:源必须继续播放,跟随者必须保持暂停,观察满十秒。
- 跟随者暂停一分钟后恢复:必须落在源当前所在位置。
- 跟随者暂停,让源切换条目两次,然后恢复:跟随者必须位于源当前条目。
适用场景
适用于实现共享会话中跟随者传输控制的 Kotlin 项目,尤其是需要让跟随者能够独立暂停而不影响整个会话的场景。
限制
文档未提供具体产品名称、安装命令、收费或价格信息。内容以设计原则、代码片段和验证命令为主,未给出完整可运行示例或平台支持范围。