From 9d2db5a648f545f87db36e594621ffe121edb652 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 6 Sep 2026 00:46:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=BD=AC=E5=8F=91/=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E8=AF=9D=E9=A2=98=E6=97=B6=E5=BA=94=E7=94=A8=E6=95=B4?= =?UTF-8?q?=E4=BD=93=E7=99=BD=E5=B1=8F=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit componentDidUpdate 的 initMessage 分支直接访问 this.messageEditArea 未判空,而输入框在 noInput(转发中)或 disabled(ACS未解析完)时会 被卸载——此时 initMessage(草稿/编辑内容)一变化就会解引用 null, 无 error boundary 兜底,整个应用白屏。 第十轮最小粒度测试 Ch3-4(实测复现2次)与 Ch8(同一处代码路径独立 命中)各自发现同一个bug。 Co-Authored-By: Claude Sonnet 5 --- src/widgets/send-message.jsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/widgets/send-message.jsx b/src/widgets/send-message.jsx index f5d5b0c2..aac712a6 100644 --- a/src/widgets/send-message.jsx +++ b/src/widgets/send-message.jsx @@ -228,9 +228,14 @@ class SendMessage extends React.PureComponent { } else if (prevProps.initMessage != this.props.initMessage) { const msg = this.props.initMessage || ''; this.setState({message: msg}, _ => { - // If there is text, scroll to bottom and set caret to the end. - this.messageEditArea.scrollTop = this.messageEditArea.scrollHeight; - this.messageEditArea.setSelectionRange(msg.length, msg.length); + // messageEditArea can be null here: initMessage (draft/edit content) can change while the + // textarea itself is unmounted, e.g. noInput during an active forward, or disabled while + // ACS is still resolving right after a topic switch. + if (this.messageEditArea) { + // If there is text, scroll to bottom and set caret to the end. + this.messageEditArea.scrollTop = this.messageEditArea.scrollHeight; + this.messageEditArea.setSelectionRange(msg.length, msg.length); + } }); } if (prevProps.reply != this.props.reply) {