android AppState事件在所有应用程序屏幕上持续存在,即使在清理后也是如此

y3bcpkx1  于 2023-05-27  发布在  Android
关注(0)|答案(2)|浏览(137)

我使用API侦听器在应用从后台进入活动状态时运行一个函数。我在useEffect清理时删除了它,但它仍然在其他屏幕上被调用,就像它从未被清理过一样。

const MyRoute = ({ navigation, route }) => {
  const appStateRef = useRef(AppState.currentState);

  useEffect(() => {
    getUserData();

    function updateRouteData(nextAppState) {
      if (appStateRef.current.match(/inactive|background/) && nextAppState === 'active') {
        getRoutes(); // <--
      }

      appStateRef.current = nextAppState;
    }

    AppState.addEventListener('change', updateRouteData);

    return () => {
      AppState.removeEventListener('change', updateRouteData);
    };
  }, []);

  // ...
}

AppState事件侦听器将保留在其他屏幕上。
react-native:“0.64.4”

ki0zmccv

ki0zmccv1#

获取变量中的事件侦听器,然后将其删除。

const appStateListener = AppState.addEventListener()

appStateListener?.remove();
z31licg0

z31licg02#

我找到解决办法了
我没有在useEffect中调用appstate逻辑,而是在react导航中使用useFocusEffect调用它。当离开屏幕时,您可以触发一个清除函数来删除监听器。
我创建了一个自定义钩子来在我的应用程序上使用它。

const useAppStateListener = (callback) => {
  const appStateRef = useRef(AppState.currentState);

  useFocusEffect(
    useCallback(() => {
      async function updateRouteData(nextAppState) {
        if (appStateRef.current.match(/inactive|background/) && nextAppState === 'active') {
          await callback();
        }

        appStateRef.current = nextAppState;
      }

      AppState.addEventListener('change', updateRouteData);

      return () => {
        AppState.removeEventListener('change', updateRouteData);
      };
    }, [callback]),
  );

  return appStateRef;
};

相关问题