react-native - React Native android中navigation.goBack和navigation.dispatch(e.data.action)有什么区别

标签 react-native react-navigation

我是 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 :

  • 用户在堆栈中的屏幕上按下了后退按钮
  • 用户执行了向后滑动手势
  • 调度了一些操作,例如 popreset,从而将屏幕从状态中移除

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/

相关文章:

javascript - 在 React Native 中将数据从子组件传递到父组件?

android - React-Native:更改 @react-navigation/material-bottom-tabs 中的徽章颜色

javascript - undefined 不是一个对象(评估 '_this2.props.navigation.navigate' ) onPress React-Native

javascript - slider 相对于 slider 拇指的显示值 native react

javascript - 从 NewsApi 读取 JSON 对象

javascript - React Native 通过react-navigation传递数据

react-native - goBack() 使用 React Navigation 到上一个/不同的堆栈

javascript - KeyboardAvoidingView 在包含一个 View 时折叠所有内部组件

react-native - null 不是对象(评估 'rngesturehandlermodule.direction' )

javascript - React-native 测试用例失败