PAYATHON 2026

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 窗口或过渡绘制问题,因此不能把它视为确定的修复方案。

备注:内容仅供参考。