【问题标题】:React Native app mysteriously freezes after dismissing a modal or action sheetReact Native 应用程序在关闭模式或操作表后神秘地冻结
【发布时间】:2020-11-13 15:28:06
【问题描述】:

我遇到了一个问题,每次我在我们的 React Native 应用程序中关闭模式、操作表或警报时,应用程序都会完全冻结并且无法与之交互。

导航到新堆栈或单击按钮不会重现。

我必须终止应用并重新启动才能再次交互。通过打包程序重新加载应用程序没有帮助。

我们的代码可以在关闭一个新模态时自动显示一个新模态,并且确实有效 - 模态是可交互的。所以似乎只有底层内容被冻结了,好像顶部还有一个模态但它是不可见的。

疯狂的是,这是在以前已知的好分支中复制。所以本地配置/缓存肯定发生了一些变化,但我不知道是什么。我重新克隆了 repo,清除了 watchman/packager/yarn 缓存,擦除了所有数据的模拟器。没有什么能解决问题。

打包器、xcode 或 Flipper 中也没有日志表明可能出了什么问题。

使用react-native-modal、@expo/react-native-action-sheet 和内置的 React Native Alert(虽然不使用通用 Expo 框架)。我已将这些库升级到最新版本。

没有想法了。我还能在哪里看?


更新:超级最少的代码复制。此模式自动显示、自动关闭,然后按钮无法按下。从代码中删除模式使按钮可以按下。

function TestApp() {
  const [isVisible, setVisible] = useState(true);
  return (
    <>
      <TouchableOpacity style={{ padding: 80 }} delayPressIn={0}>
        <Text>Touch</Text>
      </TouchableOpacity>
      <Modal isVisible={isVisible} onShow={() => setVisible(false)}>
        <Text>Foo</Text>
      </Modal>
    </>
  );
}

如果我添加一个最小警报调用而不是模式,也会发生同样的情况。在这种情况下,我会在 5 秒后显示另一个可交互的警报。 只有弹出框是可交互的——例如警报和模式。

  useEffect(() => Alert.alert("alert"), []);
  useEffect(() => {
    setTimeout(() => Alert.alert("5s alert"), 5000);
  }, []);

更新 #2

看起来每个新的“popover”样式 UI 都会使之前的 UI 无法交互。

如果我如上所述解除第一个 Alert,则我无法与底层 TouchableOpacity 交互,但我可以与第二个(5 秒)Alert 交互。

但是,如果我不关闭第一个警报并且第二个警报弹出,我只能关闭第二个警报而不与保持冻结状态的第一个警报交互。

【问题讨论】:

  • 如果没有重现样本真的很难分辨,我在 ios 中使用模态的经验是,如果您打开一个模态而没有完全确定另一个模态被关闭,那么应用程序会冻结并且有没有回应,但正如我已经告诉你的那样,如果没有看到一些代码示例,不确定这是否是你的情况。
  • 谢谢 - 这是因为代码已经工作了很长时间,所以很难看出哪些代码可能不正确。当我今天早上进来时,代码实际上正在运行 - 我认为“重新启动计算机”可能实际上是这里的修复,奇怪的是。该应用程序也可能没有收到我在一天结束时要调试的更改,例如 console.logs,这是另一个线索。
  • 现在再次重新制作,包括在完全重置计算机后,它正在接受更改...将尝试进一步诊断。
  • 你的“isVisible”useState 逻辑感觉是颠倒的。按照您上面粘贴的内容,这意味着模态将在第一次渲染时显示,然后当它显示时,onShow 函数(在显示模态后调用)将立即尝试再次隐藏它。
  • @Labu 是的,这只是一个测试用例 - 我正在看到它显示和隐藏时会发生什么。与显示后按下按钮关闭它的行为相同。

标签: react-native expo react-native-modal


【解决方案1】:

对我来说,只有当 Flipper 布局插件对我的应用程序处于活动状态时才会发生冻结。 Disabled the layout plugin,重启了Flipper,重启了我的应用,卡死问题就消失了。

【讨论】:

  • 天哪。谢谢你,谢谢你,谢谢你。这就解释了为什么我在代码中所做的一切似乎都没有影响它,以及为什么即使在已经过良好测试和工作的代码中它也会弹出!
  • 请注意,Flipper 有一个未解决的问题,但我们仍在等待有人创建小型复制项目github.com/facebook/flipper/issues/1399#issuecomment-670133415
  • 现在可以使用此解决方案,而不是禁用 Flipper:“在 ios/Podfile 中将 use_flipper! 更改为 use_flipper!('Flipper' =&gt; '0.54.0'),然后在 ios 目录中运行 pod install --repo-update。”见:github.com/facebook/flipper/issues/1399#issuecomment-681902393
【解决方案2】:

一般来说,Modal 通常伴随着一个覆盖层/背景蒙版。当您关闭一个模态框时,您是否也确定您正在关闭覆盖层,因为如果有任何透明层,那会阻止对其他控件的触摸。

【讨论】:

  • 谢谢 - 不应该有任何必要的额外工作来解除底层。这里的代码非常简单,只是指示 RN modal 隐藏,它应该将“覆盖”逻辑作为实现细节处理(之前总是有)。
【解决方案3】:

这是由于交付的 Flipper 版本过时所致。将ios/Podfile 中的use_flipper! 替换为use_flipper!('Flipper' =&gt; '0.54.0'),然后运行pod install 应该可以解决此问题。

【讨论】:

    猜你喜欢
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多