Skip to content

fix: 修复 OHOS 上可选择文本跨行拖选跳变及自由复制窗口无法滚动 - #172

Merged
wm-develop merged 2 commits into
dev4harmony:ohosfrom
wm-develop:fix/reply-copy-dialog
Aug 28, 2026
Merged

wm-develop merged 2 commits into
dev4harmony:ohosfrom
wm-develop:fix/reply-copy-dialog

Conversation

@wm-develop

Copy link
Copy Markdown
Member

问题

评论区长按 → 「自由复制」弹出的文本窗口存在两个问题(均为 OHOS 分支特有,上游 Android 端不存在):

  1. 跨行拖选跳变:长按选词后拖动,选区边缘从第一行跨到第二行时出现明显跳变,轻微拖动就会把第二行及之后的全部文字选中;且选区结束光标永远无法停在第一行末尾,最好情况只能落在第二行开头。
  2. 长文本无法滚动:评论较长、当前窗口展示不下时,无法滑动查看后面的文字。

同样的跨行拖选问题存在于所有经 SelectionText 封装的可选择文本处(动态正文、视频简介、私信、SuperChat、日志页等)。

原因

同步上游 2.1.1 时,可选择文本跟随上游从 SelectableText 换成了 SelectionArea(SelectionText 封装)。上游在标准 Flutter 上无异常,但 OHOS Flutter fork(3.41.10-ohos)上该路径有缺陷:

  • SelectionArea 长按拖选走 RenderParagraph selectable fragment 的 word 粒度边界逻辑。fork 中 widgets/selectable_region.dart 已更新到 3.41.3,而 rendering/paragraph.dart 仍停留在 3.35 版本,两层实现不匹配,拖选边缘跨行时按词边界扩展出现大幅跳选,且光标 affinity 处理缺陷导致无法停在视觉行末尾。
  • 自由复制窗口较上游实现缺少 SingleChildScrollView,超出窗口高度的文本直接被截断。

修改

核心:SelectionText 封装内部由 SelectionArea 单点切回 SelectableText(EditableText/RenderEditable 路径,与输入框选择同一套代码,按字符拖选无跳变;高度受限时自带内部滚动),即本分支同步 2.1.1 之前验证可用的旧方案。所有 SelectionText/SelectionText.rich 使用处(约 20 处)自动获得修复,调用方 API 不变。

  • lib/common/widgets/selection_text.dart:重写为 SelectableText.rich 封装;contextMenuBuilder 类型相应从 SelectableRegionContextMenuBuilder 改为 EditableTextContextMenuBuilder,默认菜单走既有的 selectableTextContextMenuBuilder(复制/分享/站内搜索),不再需要 onSelectionChanged + SelectedContentCapture 捕获机制(选中文本直接从 EditableTextState.textEditingValue 读取)。
  • lib/pages/video/reply/widgets/reply_item_grpc.dart:自由复制窗口沿用 SelectionText(现为 SelectableText 路径,长文本可内部滚动);_filterMenuBuilder 改接 EditableTextState;补上与上游一致的窗口宽度约束 BoxConstraints.tightFor(width: 380)。
  • lib/pages/dynamics/widgets/content_panel.dart:动态正文自定义菜单同步改接 EditableTextState;动态「文本」窗口补同款宽度约束。
  • lib/pages/setting/models/privacy_settings.dart:「账号模式详情」对话框由裸 SelectionArea 包整棵树改为各 API 列表块内使用 SelectionText(布局不变,选择在块内进行)。
  • lib/common/widgets/text_selection_toolbar.dart:移除不再有使用方的 selectionAreaContextMenuBuilder 与 SelectedContentCapture,避免后续误用回问题路径。

备注

ai_conclusion、article、log_table 三处为真正的跨组件选择场景(整页 CustomScrollView / 表格行),只能继续使用 SelectionArea,在 OHOS 上仍受跨行拖选跳变影响;该问题根因在 fork SDK 两层版本不匹配,待 fork 的 rendering/paragraph.dart 同步到 3.41 后有望自,应用层不做侵入式处理。

@wm-develop
wm-develop merged commit 618cc7f into dev4harmony:ohos Aug 28, 2026
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant