Repository navigation
mp-flutter 0.2.5
0.2.5 — 2026-10-01
安卓真机文本输入修复:插入文字不回显(构建期自动改写正则 Unicode 属性转义)、安卓原生输入框
放到屏幕外避免双光标、输入期间按字段 diff 不整份 setData、iOS 原生光标隐藏、焦点嵌套修复、
键盘重弹兜底、退格/空值处理、--input-timing 诊断。
输入跟手(安卓)
- 安卓原生输入框默认放到屏幕外(
android_input: offscreen/--android-input,默认):安卓
原生光标设不成透明,叠在 TextField 上会出现两根光标、两套字体排版越打越偏。现在只在安卓上把原生框
水平移出可视区(left 固定 -2000px 起,top/宽/高照常跟随,键盘顶起页面照常),iOS 仍叠放;
textarea同样处理。平台取wx.getSystemInfoSync().platform,--force-platform构建按模拟的平台。
overlay恢复旧行为。TextField 区域的点击因此落到画布上,Flutter 自己挪光标再推给原生框。 - 输入期间不再 setData:文本桥状态里
value/cursor只在引擎主动改值、程序化挪光标时出现,
视图同步按字段 diff,几何/焦点不变时一个字段都不发(之前每次按键整份 13 个字段 setData,真机 4–7ms)。
引擎清空推回原生框等两步写逻辑保留,光标也走同样的两步写。 - 修复:输入框聚焦时点画布,原生框消失、键盘收起:垫片焦点切换派发 blur 时,引擎
handleBlur同步把焦点抢回输入元素,外层随后又用过期的flutter-view通知了订阅者,文本桥以为
失焦。现在嵌套切换时只按最终焦点通知一次;同一元素重新聚焦不算新会话。 - 安卓组字期间的空 value 不清掉已上屏内容:一次事件从 ≥2 个字符直接变空(或 1→0 且带非退格
keyCode)视为可疑并丢弃。微信 WebView 的 input 拿不到组字文本(见 support-matrix 第 15 条)。 - 退格(keyCode 8)与无 keyCode 的空值一律照转:修复安卓输入法上屏后退格删不掉的问题。
- 键盘重弹兜底:原生 blur 后 5s 内键盘升起而没有聚焦中的原生框时
wx.hideKeyboard()。 --input-timing(input_timing,默认关,关闭时不打包不注入):每个输入相关事件一行[mp-t]
——触摸、引擎焦点、状态下发、setData(同步/回调)、原生 focus/blur/input(完整e.detail与
e.timeStamp)、键盘高度、ParagraphBuilder.addText出现这次输入文字(paint)、该帧 flush、
下一个 rAF(估算上屏),并用Date.now() - e.timeStamp的最小值做基准估算按键到 JS 的延迟。
修复:安卓真机输入框插入文字不回显、iOS 双光标
- 安卓真机输入框插入文字不回显(控制台
Illegal RegExp pattern (SyntaxError: Invalid regular expression: /\p{Space_Separator}/u: Invalid property name),之后一串Another exception was thrown):
安卓微信的 JS 引擎不带 ICU,不支持正则的 Unicode 属性转义\p{…}/\P{…};Flutter 框架
text_painter.dart的[\p{Space_Separator}\p{Punctuation}]与\p{Space_Separator}在插入文字时
构造,抛异常后这次更新丢掉,输入框直到失焦才刷新(删除不走这条路径)。开发者工具(Chromium)与
iOS(JavaScriptCore)都支持,复现不了。现在构建期自动改写:js/unicode-props.js扫描
main.dart.js的字符串/正则字面量,把属性转义展开成等价的\u{…}码点区间(区间由构建机
Node 遍历全部码点实测,按字符类内外位置展开,\P用补集),在分片之前执行;Node 也不认识的
属性名构建失败(退出码 5,错误码unknown-property)。 --force-platform android/android-noIntl的垫片模拟"不支持 Unicode 属性转义"(包一层
RegExp构造函数,u 标志下遇到\p{抛与真机同样的 SyntaxError),模拟器可复现;
tools/e2e/run.sh的这两个配置缺省跑accept.js+accept-interact.js。- iOS 双光标:原生透明输入框的光标(微信默认绿色)仍然可见、且与 Flutter 画的光标对不上。
<input>/<textarea>加cursor-color="#00000000"(基础库 3.1.0+,iOS 取十六进制色值;
textarea 文档未列该属性,一并带上),WXSScaret-color: transparent保留并加!important。
真机验证
安卓(小米)、iPhone 15 均已真机验证:输入法上屏、退格、组字确认均正确回显,只剩一根光标,
按键到画面渲染约 10–25ms。模拟器配置 android / android-noIntl 现在模拟"不支持 \p{}",
默认跑 accept-interact 脚本。