реагирует на состояние установки в условии внутри useEffect

#reactjs #react-native

#reactjs #реагирует на собственный

Вопрос:

Я пытаюсь избежать отображения предупреждения в React Native более одного раза. Для этого я пытаюсь обновить состояние внутри условия, которое находится внутри useEffect:

 const [permissionStatus, setPermissionStatus] = useState('');
const [permissionsAlertShown, setPermissionsAlertShown] = useState(false);
useEffect(() => {
  function handleAppStateChange() {
    if (
      AppState.currentState === 'active' amp;amp;
      permissionStatus === 'denied' amp;amp;
      !permissionsAlertShown
    ) {
      setPermissionsAlertShown(true);
      Alert.alert(
        ...
      );
    }
  }
  AppState.addEventListener('change', handleAppStateChange);
}, [permissionStatus, permissionsAlertShown]);
  

Моя проблема в том, что если я отхожу от своего приложения и возвращаюсь к нему, AppState.currentState изменяется и, поскольку setPermissionsAlertShown(true) игнорируется, мне снова отображается предупреждение.

Как мне справиться с этой ситуацией?

Комментарии:

1. Вам просто нужно сохранить состояние в AsyncStorage

2. Откуда AppState берется?

3. @Maxwells.c не могли бы вы опубликовать пример?

4. @hackape AppState происходит от React Native

Ответ №1:

Ответом было создание функции обратного вызова, которая удалит слушателя. Я поделюсь, если кто-то еще когда-нибудь будет искать это.

 const [permissionStatus, setPermissionStatus] = useState('');
const [permissionsAlertShown, setPermissionsAlertShown] = useState(false);
const handleAppStateChange = useCallback(() => {
    if (
      AppState.currentState === 'active' amp;amp;
      permissionStatus === 'denied' amp;amp;
      !permissionsAlertShown
    ) {
      setPermissionsAlertShown(true);
      Alert.alert(
        ...
      );
    }
}, [permissionStatus, permissionsAlertShown]);
useEffect(() => {
  AppState.addEventListener('change', handleAppStateChange);
  return () => AppState.removeEventListener('change', handleAppStateChange);
}, [handleAppStateChange]);
  

Ответ №2:

Вам просто нужно сохранить состояние с помощью AsyncStorage или какого-либо другого хранилища.

Идеальный случай — использовать то, что сохранилось от вашего действия (разрешение включено, данные API сохранены и т. Д.).

Комментарии:

1. Попробуйте сначала изучить AsyncStorage. Затем, если вы все еще не можете понять это, вы можете прокомментировать то, что хотите