SuperAPI AI 工具集

screen-shell-content-split

前端与建站

查看项目

更新于 10-17 16:17

技能介绍

用途

这是一个 Jetpack Compose(Kotlin)架构模式技能,主题是「screen-shell-content-split」:将单个屏幕拆分为壳层(shell)与内容层(content),以支持同一屏幕的多种可互换外观。壳层负责收集状态、运行副作用、承载 sheet 与 dialog、owns 手势状态机;内容层只接收快照与回调,仅做渲染。新增一种外观即新增一个文件加一个分支。

主要能力与结构

模式用两个持有者连接壳层与内容层:一个状态快照(如 PlayerContentState(screenData, controllerState, artworkPagerState, …))和一个动作回调包(如 PlayerContentActions(onUIEvent, onShowQueue, …))。分发通过普通 when (style) 完成,并带 else 默认分支,使未知持久化值回退到原始外观而非渲染为空。

关键约定(摘自资料)

  • 两个持有者而非一个、也不展开成参数列表:快照每次重组重建,回调包是壳层变量的闭包集合;合并会让每个回调成为重建快照的理由,展开成参数会让新外观变成每个调用点的 diff。
  • 标记 @Stable,绝不 @Immutable:持有者刻意在快照旁携带 pager state、animatable、scroll state、flow 等活句柄,@Immutable 会让运行时跳过本应执行的重组。
  • 在分支之上无条件构造两个持有者:构造在分支内会把记忆句柄绑定到该分支生命周期,切换外观会丢失滚动位置、画作页与进行中的颜色动画。
  • 分发放不需要 key(),也不需要导航目的地:不同调用点已有不同组合组;用返回栈承载展示选择会让设置开关变成压栈。
  • 按关注点逐项决定归属并写下来:视图模型收集、调色板动画、画作 pager 双向同步、自动隐藏计时器、所有 sheet 与 dialog 归壳层;若两种外观会对其产生分歧,就不归壳层。
  • 布局数学与动画曲线恰恰不应上提;共享状态对象不会让 composable 变为共享,pager 参数需在各外观内保持一致或移到状态持有者上。
  • 一个外观忽略某字段是正常的;但「某字段未被使用」的书面声明不是证据,应 grep 消费者。
  • 持有者保持与 view model 解耦,使其可用假数据预览或测试。
  • 真正共享的叶子辅助函数放在持有者文件旁,internal 且与外观无关;一旦需要按外观分支,就不再共享,应复制。

验证方式(资料提供的命令)

资料给出一组 grep 命令用于检查:两个持有者存在且为 @Stable、无 @Immutable;状态持有者携带的活句柄类型(PagerState|ScrollState|Animatable|StateFlow);持有者在 when 分支之上以同层深度构造(用 -B1 让 val 绑定可见);外观之间无互相调用;共享叶子为短小 internal 列表。手工验证:在某外观滚动到一半、翻动 pager 两页,再到设置切换外观返回,偏移与页码应保持原位。

适用场景

适用于 Compose 中同一屏幕需要多种视觉风格或布局变体、且这些变体需共享状态、副作用与弹窗逻辑的场景;也适用于希望让外观层可独立预览与测试的团队。

限制

资料未提供该技能的安装方式、运行环境要求、收费或授权信息,暂未提供。文中代码与命令均按原样保留,未作改动。