R4.14.2wrapper behavioral drift设计

包装原生控件会在细节行为上出现漂移

别名: 原生包装漂移 · React Native wrapper · 控件封装差异

概念解释

另一条跨端路不是自绘,而是用一层公共 API 去包系统控件。React Native、部分混合方案走这条路:底层仍是 UITextField 和 EditText,上层假装它们是同一个 TextInput。公共 API 是最小公倍数,细节行为会从缝里漏出来,或被冻在包装者上次对齐的那一版。这种错位叫包装行为漂移(wrapper behavioral drift)。

它不是「自绘丢掉系统行为」。系统行为还在,只是被一层过时或过薄的壳盖着。漂移发生在长按菜单、选区手柄、自动填充、焦点何时交给键盘这些细节上,静帧里几乎看不见。

机制

两端的原生控件从来不是同一个对象。包装层必须做三种坏事里的一种:把行为压到两端都能实现的子集;让差异泄漏,同一份代码在两端表现不同;或在操作系统改了控件之后,过几个版本才跟上。三种都会随时间扩大。产品团队看见的是「write once」;用户看见的是「这个输入框和系统里的那个差一点」。

漂移之所以稳,是因为它不报错。选择手柄还能用,只是位置差几个点;长按出来的是框架菜单而不是系统菜单;自动填充偶发失败。测试若只对功能「能否输入」,会放行。细节行为没有断言,就在每次系统发版时再滑开一点。

边界

包装层若对某一端开放逃生舱(直接拿到原生实例),漂移可以在那一端被钉住,代价是公共 API 不再是唯一真相。几乎不使用文本输入、选择、系统菜单的表面,漂移清单短。自绘框架里偶发嵌入的平台视图,同时带上包装缝和自绘画布边界,不要只用其中一套诊断。包装器与系统版本被一起钉死、不再跟随系统的内部设备,漂移会冻结,但冻结等于放弃系统新行为。

怎么落地

  • 把文本输入、选择、长按菜单、自动填充列为「包装敏感面」,每一端都用系统对照应用走一遍,而不是只跑公共测试套件。
  • 公共 API 覆盖不了的行为,允许端上特例,并在设计稿里写成两端不同的预期,而不是强迫像素和行为双一致。
  • 系统大版本发布后,优先回归包装控件,而不是先回归自绘动画。
  • 验证:在两端最新系统上,对同一个输入框做选择、长按、自动填充、从键盘插入建议。任何与系统备忘录或信息里同一操作不一致的细节,记为漂移。若只在一端出现,说明公共 API 在泄漏;若两端都像框架、都不像系统,说明行为被冻在子集里。

延伸

  • 同组R4.14.1 统一渲染换来外观一致,代价是失去系统行为 · R4.14.3 无障碍与输入法是最先出现裂缝的地方
  • 相邻R4.06 平台惯例与品牌一致性的冲突 · R4.01 苹果平台约定
  • 站内检索wrapper behavioral drift · React Native · native control wrapper

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/R4.14.2