我无法摆脱这个错误。当我从我的数组中删除一个项目并更新状态时,就会发生这种情况。
经过一些调试后,我发现如果我重新加载应用程序,直接进入此屏幕并删除,则不会显示错误。 但是,如果我导航到此屏幕,返回,再次转到此屏幕,然后删除,将出现错误。如果我加载屏幕10次,我会得到(30)这样的错误。
我的猜测是,当流行路线返回仪表板时,我没有关闭firebase连接。或者我正在使用的导航器没有正确卸载场景。或者deleteRow()函数
有问题我真的不知道我能做什么..同样的问题在网上,但似乎不适用于我的情景。
ffmpeg
答案 0 :(得分:2)
问题是他们提到的,但没有提供解决方案。 经过一段时间和一些外部帮助,这解决了我的问题: 只需删除监听器即可。
componentWillUnmount() {
this.itemsRef.off(); // this line
this.connectedRef.off('value', this.handleValue);
}
答案 1 :(得分:1)
我不确定它是否导致您出错但是这是一个错误,您需要绑定您的事件处理程序,最好是在您的构造函数中,因为您要取消绑定(删除事件侦听器),您需要引用相同的功能。
constructor(props) {
super(props);
this.state = {
dataSource: new ListView.DataSource({
rowHasChanged: (row1, row2) => row1 !== row2,
}),
};
const user = firebase.auth().currentUser;
if (user != null) {
this.itemsRef = this.getRef().child(`Stores/${user.uid}/`);
} else {
Alert.alert('Error', 'error!');
}
this.connectedRef = firebase.database().ref('.info/connected');
this.handleValue = this.handleValue.bind(this) // here added
}
希望它有效,也解决你的问题。
答案 2 :(得分:1)
您没有关闭所有的事件处理程序。
您可以在函数'value'
内的itemsRef
对象上为listenForItems()
事件创建事件处理程序。该事件处理程序调用{{1}}。该特定事件处理程序未被关闭,这意味着每个后续数据库事件都会调用回调函数,该函数会尝试在旧(未安装)组件上调用setState()
。
您应该关闭setState()
中的所有事件处理程序,因此:
componentWillUnmount()