React Native makes TextInput feel controlled, but native owns the text and your JS value is a lagging copy. An eventCount handshake stamps each write; if you typed while JS re-rendered, the counts mismatch and native drops the write on purpose. The leftover dropped characters come from transforms, cursor races, IME resets, and the old architecture. It is worst on a busy chat screen. Fix: keep the keystroke path cheap or go uncontrolled.