如何使用useEffect要求2个useStates的许可

问题描述

我想同时请求camera和camera_roll的许可。一旦我添加了camera_roll权限的代码,相机权限就不再运行。

swap:
    mov eax,[rdi]    ; *a to EAX
    xchg eax,[rsi]   ; Exchange *a with *b
    mov [rdi],eax    ; EAX to *a
    ret
const [hasPermission,setHasPermission] = useState(null);
const [rollPermision,setRollPermission] = useState(null);

如果许可失败...相信我这里的if语句太多,但我不知道怎么做

 useEffect(() => {
    (async () => {
      getpermission()
      const { status } = await Camera.requestPermissionsAsync();
      setHasPermission(status === "granted");
      // camera roll
      const { cam_roll } = await Permissions.askAsync(Permissions.CAMERA_ROLL);
      setRollPermission(cam_roll === "granted");
    }
    )();
  },[]);

解决方法

那里的useReducer钩子似乎是一个更好的选择。想您将用它创建更优雅的API。

,

改善用户体验的更好方法是:

const [hasPermission,setHasPermission] = useState(false);
const [rollPermision,setRollPermission] = useState(false);

我认为Permissions.CAMERA_ROLL仅对于iOS是必需的。

useEffect(() => {
    (async () => {
      getpermission()
      const { status } = await Camera.requestPermissionsAsync();
      setHasPermission(status === "granted");
      // camera roll
      if (Constants.platform.ios) {
        const { cam_roll } = await Permissions.askAsync(Permissions.CAMERA_ROLL);
        setRollPermission(cam_roll === "granted");
      } else {
        setRollPermission(true);
      }
    }
    )();
  },[]);
if (!hasPemission || !rollPermision) {
  return (
    <View>
      <Text style={styles.text}>To acess the camera,yoou need:</Text>
      {!hasPermission && (
        <TouchableHighlight onClick={handleAskPemission('CAMERA')>
         <Text style={styles.text}>Camera Roll permission</Text>
        </TouchableHighlight>
      )}
      {!rollPermision && Constants.platform.ios && (
        <TouchableHighlight onClick={handleAskPemission('CAMERA_ROLL')>
         <Text style={styles.text}>Camera Roll permission</Text>
        </TouchableHighlight>
      )}
    </View>
  )
}

  return <CameraView />