react / react/react-native

Text visually truncated mid-word despite correct onLayout/onTextLayout measurement

未关闭
#57,920 2 条评论 2 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

主要语言
C++
星标
127k
派生
25.3k
平均合并
1 天 23 小时
30 天内合并 PR
4

描述

Description

A multi-line <Text> inside a list (FlatList, @shopify/flash-list, or
even a plain ScrollView) is sometimes visually truncated mid-word,
even though onLayout / onTextLayout report a correct and complete
measurement for the same text.

Evidence gathered from a minimal, isolated repro:

  • onLayout sometimes reports a height that doesn't match onTextLayout's
    own measured content — either a tiny fractional value (e.g.
    479.99993896484375 instead of exactly 480), or a value roughly one
    whole line taller than what onTextLayout itself measured as needed
    (e.g. container 288/12 lines vs text measured at 264/11 lines).
  • onTextLayout, for the exact same text and style, can report a
    different lines.length between two mounts, with the container width
    strictly constant.
  • Despite onTextLayout reporting the correct, complete text (including
    its exact final characters), the visual render sometimes stops mid-word,
    with blank space left where the missing text should be — a divergence
    between a correct measure pass and an incomplete native paint pass.

This was first found in a production app and then isolated down to a
minimal case. The following were tested and ruled out as the cause:

  • Any specific list component: reproduces identically with
    @shopify/flash-list, core FlatList, and a plain ScrollView.
  • Custom fonts: reproduces identically with the system font (no
    fontFamily set at all).
  • Special characters: reproduces with plain ASCII English text, no accents,
    no quotation marks, periods only.
  • Insufficient container height: onLayout sometimes reserves more
    height than onTextLayout measured as necessary, and the text is still
    visually truncated.
  • A component remount (key change): the bug survives a full remount.
  • A text-measurement cache keyed by content: making every occurrence of a
    repeated paragraph textually unique did not spread the bug to more
    occurrences.

The bug is intermittent and appears to depend on rendering context
(surrounding items, timing) rather than the text content or any specific
component — the exact same paragraph text reproduces at one list position
and not another, and moving it to a different position moves the
reproduction with it.

Steps to reproduce
  1. Clone the reproducer: https://github.com/Ge0ffreyS/rn-font-issue
  2. npm install && npx expo run:ios
  3. The app renders ~150 numbered paragraphs on load. Watch the Metro
    console for [REPRO] onLayout ... <<< SUSPECT log lines and look at the
    screen for a paragraph whose text stops mid-word with blank space below
    it.
  4. If it doesn't reproduce on first load, reload the app a few times
    (Cmd+R in the simulator) — it's intermittent. A "Scroll to bottom"
    button is provided to check paragraphs further down the list.

Full isolation-testing notes and commit-by-commit findings are in the
repo's README.

React Native Version

0.86.2

Affected Platforms

Runtime - iOS, Android

This minimal repro was tested on iOS (simulator). The underlying text
truncation was also observed on Android (16 / API 36) with the same
fontSize/lineHeight in the production app this repro was extracted
from, though not exhaustively isolated there.

Environment
OS: macOS 26.6.1
Node: 22.23.2
expo: ~57.0.12
react: 19.2.3
react-native: 0.86.2

(npx react-native info doesn't run standalone in this Expo-managed repro;
the versions above are read directly from package.json.)

Stacktrace or Logs
[REPRO] onTextLayout lineCount=11 height=264 lastLineText="...This is repeat number 1." text="18. A former head chef says th..."
[REPRO] onLayout height=287.999755859375 text="18. A former head chef says th..."  <<< SUSPECT

onTextLayout measured 11 lines (264px, correct, complete text) but the
container (onLayout) reserved 288px (12 lines) — a full line more than
what was measured as necessary — and the paragraph is visually cut off
mid-word regardless.

Reproducer

https://github.com/Ge0ffreyS/rn-font-issue

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

先从链接的 rn-font-issue reproducer 及其 README 开始,然后运行 npm install && npx expo run:ios 并检查 Metro 的 [REPRO] 日志。在复现视觉截断的同时,对比 onLayoutonTextLayout 的测量结果。当段落在受影响的平台上完整渲染且不存在所报告的差异时,即表示完成。

由索引模型根据 Issue 内容生成。

评估

技术栈
android, ios, react-native
领域
mobile
Issue 类型
缺陷
难度
5/5
预计耗时
一周以上
活跃度
活跃
描述清晰度
基本清楚
新手友好度
32/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。