Răsfoiți Sursa

refactor(Track E·R1.1): 排版快照重建站点收敛到三条真实通道

E2 收尾。此前 5 处重建里有 2 处是失效兜底:

- `ReadBookIntent.OnConfigUpdated` 全仓无构造点(死代码),且只重建
  styleConfig 不重建 sheetConfig——正是「弹层显示旧值」的原始形态。
  连同 Contract 里的 intent 一并删除。
- `syncFromReadBook` 每次会话快照发射(翻页/换章/位置 settle)都重建两份
  排版快照。排版配置与会话状态无关,这是纯浪费,更糟的是它会掩盖真正的
  漏发——任何漏发都会在下一次翻页被悄悄补上,让 bug 变成「偶现」。

保留的三处覆盖全部写入通道(已在 collectReadStyle 注释里写明删除前提):
gateway collector(经 repository 的排版写入)、ReadConfigUpdateBus collector
(日夜切换等不递增 revision 的全局变更)、handleConfigUpdate 的
styleMutation == null 分支(只写 DataStore 的更新)。

验证:compileAppDebugKotlin + 410 单测全绿(含 ReaderConfigSnapshotInvariantTest
与 ReadStyleStateRevisionTest 两条 E0/E2 护栏)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
5151561 3 luni în urmă
părinte
comite
2e7d0e0ef2

+ 0 - 3
app/src/main/java/io/legado/app/ui/book/read/ReadBookContract.kt

@@ -648,9 +648,6 @@ sealed interface ReadBookIntent {
     // Bookshelf
     data object RemoveFromBookshelf : ReadBookIntent
 
-    // Config update (triggers ReadView upBg/upStyle etc.)
-    data class OnConfigUpdated(val actions: Set<ConfigUpdateAction>) : ReadBookIntent
-
     // Typed config mutation — single entry point for all ReadBookConfig changes
     data class UpdateConfig(val update: ConfigUpdate) : ReadBookIntent
 

+ 7 - 7
app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt

@@ -324,6 +324,13 @@ class ReadBookViewModel(
      *
      * 改由 gateway 的 `publishState()` 统一驱动后,「新增写入路径忘了重建快照」这个
      * 失效类别不再存在:写入必经 gateway,gateway 必发 state,这里必然重建两份快照。
+     *
+     * R1.1 收敛后全 VM 只允许三处重建触发,删任何一处前先确认其路径已被其余覆盖:
+     * 1. 本 collector——一切经 gateway 的排版写入(编辑/预设/删除/导入,repository 必 publishState);
+     * 2. [collectEventBus] 的 [ReadConfigUpdateBus] collector——不经 gateway 的全局变更
+     *    (日夜切换等,revision 不递增,gateway flow 不会发射);
+     * 3. [handleConfigUpdate] 尾部 `styleMutation == null` 分支——只写 DataStore 的更新。
+     * `syncFromReadBook` 不再重建(曾经的每翻页兜底会掩盖漏发问题)。
      */
     private fun collectReadStyle() {
         viewModelScope.launch {
@@ -921,11 +928,6 @@ class ReadBookViewModel(
             }
 
             is ReadBookIntent.RemoveFromBookshelf -> removeFromBookshelf()
-            is ReadBookIntent.OnConfigUpdated -> {
-                _uiState.update { it.copy(styleConfig = buildStyleConfig()) }
-                _effects.tryEmit(ReadBookEffect.UpdateReadViewConfig(intent.actions))
-            }
-
             is ReadBookIntent.UpdateConfig -> {
                 handleConfigUpdate(intent.update)
             }
@@ -2541,8 +2543,6 @@ class ReadBookViewModel(
             delHTag = book?.getDelTag(Book.hTag) ?: false,
             sameTitleRemoved = textChapter?.sameTitleRemoved ?: false,
             isReadingProgressSyncConfigured = isReadingProgressSyncConfigured(),
-            styleConfig = buildStyleConfig(),
-            sheetConfig = buildSheetConfig(),
             menuConfig = ReadMenuConfig(
                 titleBarIconPosition = ReadBookConfig.titleBarIconPosition,
                 showTitleBarIcons = ReadBookConfig.showTitleBarIcons,