Expo Android 请求相机权限时页面切换为何闪白?
数据小陈
结论
从描述看,白屏似乎与相机组件是否挂载无关:只请求相机权限时也会出现,普通 View 页面切换则正常。问题集中在 Android 上从 Settings 页面进入 QR 页面时,权限请求与页面过渡动画同时发生。可以先将 QR 页的权限检查延后到过渡结束,再观察白屏是否消失。目前还无法确定白屏的具体根因。
先在 QR 页面延后请求权限
如果使用 React Navigation 的 Stack,可以在 QR 页面监听进入页面后的过渡结束事件,再在页面内检查并请求权限。例如:
import { useEffect } from 'react';
import { useCameraPermissions } from 'expo-camera';
function QrScreen({ navigation }) {
const [permission, requestPermission] = useCameraPermissions();
useEffect(() => {
const unsubscribe = navigation.addListener('transitionEnd', (event) => {
if (event.data?.closing) return;
if (!permission?.granted) {
void requestPermission();
}
});
return unsubscribe;
}, [navigation, permission?.granted, requestPermission]);
return null; // 替换为 QR 页面内容
}
transitionEnd 是导航器提供的事件,是否支持以及事件数据结构取决于所用的 navigator。若项目使用 Expo Router 或其他导航方案,应使用对应的页面过渡完成事件。只需等进入 QR 页的过渡结束后,再执行该页面自己的权限检查,无需将检查移到全局。
实际页面中,避免在每次渲染时都调用权限请求函数。先读取当前权限状态,只在尚未授权且页面需要相机功能时请求。如果用户已拒绝,且系统不允许再次弹出请求,则提供前往系统设置的引导。
验证范围
分别检查首次进入、已授权、拒绝后再次进入,以及从 Settings 页面返回 QR 页的情况。如果延后权限请求后白屏仍然出现,可以暂时改为由页面内的按钮触发权限检查,以判断问题是否与页面过渡和自动请求同时发生有关,或是否涉及其他导航或原生界面问题。root background color 已在其他页面生效,但这不能说明它能消除权限请求期间的 Android 窗口或过渡绘制问题,因此不能把它视为确定的修复方案。
备注:内容仅供参考。
