React Native: 点击通知后恢复时,AppState.addEventListener会注册重复事件

4

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

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

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

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

当我正常退出应用程序并恢复时,它会按预期打印“do stuff”,然而(这里是问题),当应用程序最小化并且我点击通知时,应用程序将打印两次“Do stuff”。
我已经发现,这是因为当我点击通知时,它似乎重新运行了应用程序(包括构造函数部分),这意味着它创建了第二个事件监听器...
那么,有人知道为什么在点击通知时会出现这种情况,以及是否可以通过使用react-native-push-notification插件来防止它,或者是否有一种方法可以确保不注册重复事件吗?
这在我的Android物理设备上发生,不确定是否也是iOS问题,但只是想检查一下是否有人知道是否可能。

componentDidMount 可能更适合您的事件订阅。也许这就是为什么有时会被订阅但无法取消订阅的整个问题所在。 - DogeAmazed
我已经测试过了,谢谢。但我认为问题不一定与此相关(但你可以说这可能是一个更好的放置位置)。 - JackDev
3个回答

8

经过长时间的苦思冥想,我终于想出了一个解决方案。虽然不是很完美,但目前可以胜任工作。

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

我认为AppState页面https://facebook.github.io/react-native/docs/appstate非常不足,这就是为什么我现在只能看到这个私有方法的唯一选择。如果可能的话,我会尝试跟进团队,看看是否可以改进它,因为在某些情况下,您可能不希望注册重复的事件。


2
现在我遇到了这个tsc错误:错误TS2339:在类型“AppStateStatic”上不存在属性'_eventHandlers'。 - dazza5000

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 }

0

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

我的建议是明确检查Android:

if (Platform.OS === 'android' && AppState._eventHandlers.change.size === 0)

它会引起哪些崩溃,为什么?如果您能确认,我很乐意更新我的答案。 - JackDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接