From c051ba9585aa079bf4bb050c46ee6951c6c254a2 Mon Sep 17 00:00:00 2001 From: OneWay Date: Tue, 6 Oct 2026 09:42:54 +0800 Subject: [PATCH] fix(article): stabilize baseTextStyle across recompositions TextStyle.copy() returned a new instance on every recomposition, so the remember() cache for the rendered blocks never hit. A text selection re-ran block merging and recreated all article text nodes, rebuilding their StaticLayouts repeatedly. Hoist the theme values and remember the style. --- .../research/ui/article/ArticleScreen.kt | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/example/research/ui/article/ArticleScreen.kt b/app/src/main/java/com/example/research/ui/article/ArticleScreen.kt index 68c04da..e3342ad 100644 --- a/app/src/main/java/com/example/research/ui/article/ArticleScreen.kt +++ b/app/src/main/java/com/example/research/ui/article/ArticleScreen.kt @@ -118,13 +118,17 @@ fun ArticleContent( } is ArticleState.Success -> { val articleSaveKey = "${articleState.dictionaryPath}:${articleState.title}" - val baseTextStyle = MaterialTheme.typography.bodyLarge.copy( - color = MaterialTheme.colorScheme.onSurface, - lineHeightStyle = LineHeightStyle( - alignment = LineHeightStyle.Alignment.Proportional, - trim = LineHeightStyle.Trim.Both, - ), - ) + val colorScheme = MaterialTheme.colorScheme + val typography = MaterialTheme.typography + val baseTextStyle = remember(colorScheme, typography) { + typography.bodyLarge.copy( + color = colorScheme.onSurface, + lineHeightStyle = LineHeightStyle( + alignment = LineHeightStyle.Alignment.Proportional, + trim = LineHeightStyle.Trim.Both, + ), + ) + } val indentStep = 16.dp // Use scroll position from ArticleState if available (for back navigation)