3

当我的应用程序从后台恢复时,我有想要运行的代码。为此,我使用 AppState.addEventListener() 注册了一个事件。

  const handleAppStateChange = () => {
    console.log('Do stuff')
  }

  constructor(props: Props) {
    super(props)
    AppState.addEventListener('change', this.handleAppStateChange)
  }

  componentWillUnmount() {
    AppState.removeEventListener('change', this.handleAppStateChange)
  }

当我通常退出应用程序并恢复时,它会按预期打印“做事”,但是(这是问题所在),当应用程序最小化并点击通知时,应用程序将打印两次“做事”。

我发现这是因为当我点击通知时,它似乎重新运行了应用程序(包括构造函数部分),这意味着它创建了第二个事件侦听器......

那么,有没有人知道为什么在点击通知时会这样做以及我是否可以阻止它(使用 react-native-push-notification 插件),或者是否有办法确保不注册重复事件?

这发生在我的 Android 物理设备上,不确定这是否也是 iOS 问题,但只是想我会检查是否有人知道这是否可能)

4

3 回答 3

6

所以经过一番苦恼,我设法想出了一个解决方案。这不是很好,但现在可以完成工作。

if (AppState._eventHandlers.change.size === 0) {
  AppState.addEventListener('change', this.handleAppStateChange)
}

我觉得 AppState 页面https://facebook.github.io/react-native/docs/appstate严重不足,这就是为什么我现在能看到的唯一选择是这种私有方法。如果可以改进,将尝试与团队跟进,因为在某些情况下您不希望注册重复的事件是有道理的。

于 2019-02-01T17:06:47.627 回答
0

当我使用

if (AppState._eventHandlers.change.size === 0) {

AppState.addEventListener('change', this.handleAppStateChange) } 我收到了这个错误:

Now I have this tsc error: error TS2339: Property '_eventHandlers' does not exist on type 'AppStateStatic'.

所以,我回滚了它,然后我解决了 AppState.addEventListener 在点击通知时在恢复时注册重复事件,方法是将箭头函数更改为以这种方式运行:

AppState.addEventListener('change', controlSocketConnection);
function controlSocketConnection() { // some code }
于 2020-10-26T07:31:38.710 回答
0

上面的答案仍然是正确的,但它可能会导致 iOS 13 崩溃。它在 Android 上运行良好。

我的建议是明确检查 Android:

if (Platform.OS === 'android' && AppState._eventHandlers.change.size === 0)
于 2020-04-18T20:33:57.870 回答