【发布时间】: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