获取react native中的用户不活动状态

jchrr9hc  于 2023-03-19  发布在  React
关注(0)|答案(2)|浏览(99)

我想要的是显示图像,如果用户没有与应用程序互动1分钟。我已经尝试通过设置定时器的所有用户事件,如onPress onSwipe等所有元素来实现它。但处理这些是一个复杂的过程。然后我尝试使用InteractionManager,但也没有工作。我想知道的是,有什么方法可以知道是否发生了任何用户事件?

nwo49xxi

nwo49xxi1#

最后,我用PanResponder做了。它工作得完美无瑕。它需要按键,滑动和拖动。
博览会链接:https://snack.expo.io/Sy8ulr8B-
下面是我的代码:

import React, { Component } from 'react';
import { Button, PanResponder, View, StyleSheet,TouchableOpacity, Text , Image} from 'react-native';

export default class App extends Component {
  state = {
    show : false
  };
  _panResponder = {};
  timer = 0;
  componentWillMount() {
    this._panResponder = PanResponder.create({

      onStartShouldSetPanResponder: () => {
        this.resetTimer()
        return true
      },
      onMoveShouldSetPanResponder: () => true,
      onStartShouldSetPanResponderCapture: () => { this.resetTimer() ; return false},
      onMoveShouldSetPanResponderCapture: () => false,
      onPanResponderTerminationRequest: () => true,
      onShouldBlockNativeResponder: () => false,
    });
    this.timer = setTimeout(()=>this.setState({show:true}),5000)
  }

  resetTimer(){
    clearTimeout(this.timer)
    if(this.state.show)
    this.setState({show:false})
    this.timer = setTimeout(()=>this.setState({show:true}),5000)
  }

  render() {
    return (
      <View
        style={styles.container}
        collapsable={false}
        {...this._panResponder.panHandlers}>

        {
          this.state.show ? <Text style={{fontSize:30}}>Timer Expired : 5sec</Text> : null
        }

        <TouchableOpacity>
          <Image style={{width: 300, height: 300}} source={{uri: 'https://facebook.github.io/react/img/logo_og.png'}} />
        </TouchableOpacity>

        <Button
          title="Here is a button for some reason"
          onPress={() => {}}  
        />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
    backgroundColor: '#ecf0f1',
  }
});
rhfm7lfc

rhfm7lfc2#

下面是我如何使用react-navigation自定义导航器实现非活动监听器。我使用react-native PanResponder来检测触摸活动。由于这是安装到应用的根目录,因此在多个位置安装setTimout不会有任何问题。

import React, {useCallback, useEffect, useRef} from 'react';
import {useKeycloak} from '@react-keycloak/native';
import {
  NavigationHelpersContext,
  useNavigationBuilder,
  StackRouter,
} from '@react-navigation/native';
import {View, PanResponder} from 'react-native';

const CustomNavigator = ({initialRouteName, children, screenOptions}) => {
  const {state, navigation, descriptors} = useNavigationBuilder(StackRouter, {
    children,
    screenOptions,
    initialRouteName,
  });
  const [keycloak] = useKeycloak();
  const timerId = useRef(false);

  useEffect(() => {
    resetInactivityTimeout();
  }, [resetInactivityTimeout]);

  const panResponder = useRef(
    PanResponder.create({
      onStartShouldSetPanResponderCapture: () => {
        resetInactivityTimeout();
      },
    }),
  ).current;

  const resetInactivityTimeout = useCallback(() => {
    clearTimeout(timerId.current);
    timerId.current = setTimeout(() => {
      // action after user has been detected idle
      // ex: logout from the app
    }, 30000);
  }, []);

  return (
    <NavigationHelpersContext.Provider value={navigation}>
      <View style={{flex: 1}} {...panResponder.panHandlers}>
        {descriptors[state.routes[state.index].key].render()}
      </View>
    </NavigationHelpersContext.Provider>
  );
};

export default CustomNavigator;

相关问题