我是 React Native 新手,我有适用于 Android 的 React Native 应用程序,并且我正在使用 Navigation 5 导航到下一页。应用程序工作流程为loginScreen -> HomeScreen -> ExistingStockScreen -> ScanSkidBarcodeScreen -> ScanItemsScreen。 我正在使用 ScanItemScreen 上的此代码处理后退按钮按下操作。
navigation.addListener('beforeRemove', (e) => {
// Prevent default behavior of leaving the screen
e.preventDefault();
if (this.state.items[0].barCode !== "" && this.state.items[5].barCode !== "") {
Alert.alert(
'Error!',
'You can only scan six items at a time.',
[
{ text: "OK", style: 'cancel', onPress: () => { } },
]
);
}
else if (this.state.items[0].barCode !== "") {
Alert.alert(
'Attention!',
'You have unsaved items. Please click on UPDATE STATUS first and go back.',
[{ text: "OK", style: 'cancel', onPress: () => { } },
{
text: 'Go Back',
style: 'destructive',
// If the user confirmed, then we dispatch the action we blocked earlier
// This will continue the action that had triggered the removal of the screen
onPress: () => navigation.dispatch(e.data.action),
},]
);
} else {
navigation.dispatch(e.data.action)
}
})
}
但是,navigation.dispatch(e.data.action) 代码将返回屏幕,但由于某种原因会注销用户。 所以我想改用 navigation.goBack() 。 navigation.goBack() 和 navigation.dispatch(e.data.action) 有什么区别?
最佳答案
当屏幕被移除时,会触发 beforeRemove
事件,这可能是由于各种原因(例如重置
或其他操作)而发生的。虽然返回是触发它的方法之一,但这不是唯一的方法。
来自docs :
- 用户在堆栈中的屏幕上按下了后退按钮
- 用户执行了向后滑动手势
- 调度了一些操作,例如
pop
或reset
,从而将屏幕从状态中移除
e.data.action
中的对象指的是触发该事件的操作。通过使用 navigation.dispatch(e.data.action) 再次调度该操作,您可以在执行所需的任何检查后继续该操作,例如提示用户。
如果您不再次分派(dispatch)事件,而是尝试 goBack()
:
- 这是不正确的行为 - 如果重置触发了事件,您应该继续重置(或触发事件的原因),而不是完全执行不同的操作
- 无论如何它都不起作用,因为
goBack
只会触发该事件,因此您将陷入提示循环
However navigation.dispatch(e.data.action) code is going to back screen but it logs out the user for some reason
React Navigation 不会与您的应用状态交互。如果您的用户在导航时注销,则这是代码中的错误,您需要调试和修复。
关于react-native - React Native android中navigation.goBack和navigation.dispatch(e.data.action)有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64852211/