我用以下方法添加了侦听器(尝试同时放入构造函数和componentDidMount):应用状态.addEventListener('更改',此._handleAppStateChange);
并且在componentWillUnmount方法中以以下方式删除了侦听器:
应用状态.removeEventListener('更改',此._handleAppStateChange);
在回调函数中:
_handleAppStateChange = (nextAppState) => {
setTimeout(() => {
alert('App state: ' + this.state.appState);
alert('Next App state: ' + nextAppState);
}, 0);
}
它发出了几次警报。它没有删除配置的侦听器一次。请让我知道是否有人知道它?
8条答案
按热度按时间7uhlpewt1#
removeEventListener
已弃用**文档现在建议对从
AppState.addEventListener
返回的订阅对象(EmitterSubscription
)使用remove
函数。示例用法:
oewdyzsn2#
你应该像现在这样使用API
5cnsuln73#
最近几天我也遇到了同样的问题,我最终通过将应用状态管理迁移到App.js组件并创建了一个服务管理器来解决这个问题。
下面是我的
App.js
的大致情况:AppStateService.js
:下面是如何从应用组件中的任意位置调用它:
这样,您就可以在应用中的任何位置监听应用前台/非活动/后台状态,并正确订阅/取消订阅这些事件。
6ie5vjzr4#
从代码的外观来看,我假设您使用的是类组件,我解决这个问题的方法是创建一个指针函数,指向
this
作用域内的实际函数,而不使用.bind(this)
。例如
vulvrdjw5#
必须从
ComponentWillUnmount
函数中删除侦听器gmxoilav6#
设置状态是一个异步进程。因此在componentWillUnmount中,不要将其用作组件卸载,并且对于该场景,setState仍在进程中,从而导致警报。
jslywgbw7#
可能是由于您正在收听的功能发生变化而导致的
它工作正常
它不工作,所以也许你需要这样
在构造函数中
eni9jsuy8#
我们可以修改代码如下:
使用效果(()=〉{常量状态监听器=应用状态.添加事件监听器('change ',handleAppStateChange);
}、[]);
常量句柄应用状态更改=(下一个应用状态)=〉{if(应用状态.当前.匹配(/inactive|background/)&& nextAppState ==='active'){console. log('应用程序已进入前台!');设置连接状态(真);} else {console. log('App已进入后台或不活动!');设置连接状态(假);}
};