From e266a4e69028010784c5c3a555f9f465465868b5 Mon Sep 17 00:00:00 2001 From: fengge <844143714@qq.com> Date: Wed, 3 Jun 2026 14:48:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96(UI):=20=E4=BF=AE=E5=A4=8D=20?= =?UTF-8?q?Markdown=20=E6=B8=B2=E6=9F=93=E5=AF=BC=E8=87=B4=E7=9A=84?= =?UTF-8?q?=E5=86=85=E5=AD=98=E6=8A=96=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 Markwon 解析引擎的 builder 创建逻辑提取到 LazyColumn 的外部并记忆化(remember),将其作为参数传入每一条消息的渲染组件中。 这避免了在聊天列表滚动时,每条消息都会高频实例化一个极度消耗资源的全新的 Markwon 引擎,从而极大减少了短命对象的创建和 GC 压力。 --- .../standapp/ui/chat/components/ChatArea.kt | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/stand/standapp/ui/chat/components/ChatArea.kt b/app/src/main/java/com/stand/standapp/ui/chat/components/ChatArea.kt index 3e2a1df..2580c4a 100644 --- a/app/src/main/java/com/stand/standapp/ui/chat/components/ChatArea.kt +++ b/app/src/main/java/com/stand/standapp/ui/chat/components/ChatArea.kt @@ -40,6 +40,18 @@ fun ChatArea( } } + val context = androidx.compose.ui.platform.LocalContext.current + val markwon = remember(context) { + io.noties.markwon.Markwon.builder(context) + .usePlugin(io.noties.markwon.core.CorePlugin.create()) + .usePlugin(io.noties.markwon.ext.tables.TablePlugin.create(context)) + .usePlugin(io.noties.markwon.html.HtmlPlugin.create()) + .usePlugin(io.noties.markwon.linkify.LinkifyPlugin.create()) + .usePlugin(io.noties.markwon.ext.strikethrough.StrikethroughPlugin.create()) + .usePlugin(io.noties.markwon.ext.tasklist.TaskListPlugin.create(context)) + .build() + } + val isAnyStreaming = remember(messages) { messages.any { it.isStreaming } } if (isAnyStreaming) { val totalLength = messages.map { it.content.length }.sum() @@ -111,6 +123,7 @@ fun ChatArea( val contentWithCursor = msg.content + if (msg.isStreaming) " █" else "" MarkwonRenderer( markdown = contentWithCursor, + markwon = markwon, modifier = Modifier.padding(12.dp) ) } @@ -161,19 +174,7 @@ fun ChatArea( } @Composable -fun MarkwonRenderer(markdown: String, modifier: Modifier) { - val context = androidx.compose.ui.platform.LocalContext.current - val markwon = remember(context) { - io.noties.markwon.Markwon.builder(context) - .usePlugin(io.noties.markwon.core.CorePlugin.create()) - .usePlugin(io.noties.markwon.ext.tables.TablePlugin.create(context)) - .usePlugin(io.noties.markwon.html.HtmlPlugin.create()) - .usePlugin(io.noties.markwon.linkify.LinkifyPlugin.create()) - .usePlugin(io.noties.markwon.ext.strikethrough.StrikethroughPlugin.create()) - .usePlugin(io.noties.markwon.ext.tasklist.TaskListPlugin.create(context)) - .build() - } - +fun MarkwonRenderer(markdown: String, markwon: io.noties.markwon.Markwon, modifier: Modifier) { androidx.compose.ui.viewinterop.AndroidView( factory = { ctx -> val textView = SafeSelectableTextView(ctx).apply {