在几次安装后,Canvas 将永久停止呈现(iOS + Android)
作者: Kerumen创建于 2026年9月1日更新于 2026年9月2日
[!IMPORTANT] 已更新 — 现在有一个独立的重现,原始描述中的部分是错误的。
重现: https://GitHub.com/Kerumen/skia-blank-repro —
pnpm install && npx expo run:ios。它自动循环,画布在 ~5-8 次循环中变为空白。通过从失败的应用程序中减去来重新分割,而不是尝试重新构建它。 五个条件,每个条件从一个重现构建中删除,然后恢复:
- 同时存在两个 Skia 画布。 只有一个情况下才不会触发。卸载一个并不需要 — 两个共存就够了。
- 画布的祖先携带着一个 Reanimated 动画样式 — 它可能已经完成并处于标识变换中。
- 一个兄弟视图在一段时间后安装了一个
entering布局动画。 同一个兄弟作为一个普通<View>从来不会触发它。- 第二个兄弟运行自己的
useAnimatedStyle位于第一个后面。- 一个
GestureDetector包裹了第二个画布。 用一个普通View替换它 — 两行代码 — 就可以停止此错误;恢复它就可以恢复它。对下面的表格有两个修正:
- "具有其
entering布局动画的相同文本再次变为空白" 这一行 被混淆了 — 另一个元素仍在安装,它具有自己的FadeIn。entering动画是必需的(条件 3)。- 条件 1、4 和 5 在原始版本中完全缺失。特别是,
GestureDetector是必需的,下面没有提及它。重现的 README 还列出了什么不重要:场景复杂性、第三个画布、图像纹理、14 个独立动画的视图的爆发、每帧重新记录陀螺倾斜、一个缩放祖先、跨动画的网络 I/O 以及画布子树的安装时机。
工作绕行没有变化:放弃动画样式,只要没有任何东西在移动(
lib/fix.ts中的FIX)。静止时,变换是标识,因此在视觉上是相同的。
内容来源: Shopify/react-native-skia