Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用react native在注销时正确卸载所有屏幕?_Android_Ios_Node.js_Reactjs_React Native - Fatal编程技术网

Android 如何使用react native在注销时正确卸载所有屏幕?

Android 如何使用react native在注销时正确卸载所有屏幕?,android,ios,node.js,reactjs,react-native,Android,Ios,Node.js,Reactjs,React Native,我正在使用react本机和堆栈导航器以及选项卡导航器构建一个应用程序。导航时,屏幕从不卸载。我想在用户按下“注销”按钮时卸载屏幕,因此当新用户登录时,所有屏幕都需要重新安装,而不需要保留旧的状态 我该怎么做? 在屏幕内使用this.props.navigation.poptoop()不起作用 我当前的导航器结构: App DrawerNavigator -> OnBoard Drawer Navigator --> (SignIn screen, SignUp screen)

我正在使用react本机和堆栈导航器以及选项卡导航器构建一个应用程序。导航时,屏幕从不卸载。我想在用户按下“注销”按钮时卸载屏幕,因此当新用户登录时,所有屏幕都需要重新安装,而不需要保留旧的状态

我该怎么做? 在屏幕内使用
this.props.navigation.poptoop()
不起作用

我当前的导航器结构:

App DrawerNavigator -> OnBoard Drawer Navigator --> (SignIn screen, SignUp screen)
                    -> Logged Drawer Navigaror --> Home Tab Navigator
                                               --> Settings Stack Navigator -->(Settings screen)
我正在调用设置屏幕内的注销功能。

你能试试吗

从“反应导航”导入{StackActions};//之前
从“@react navigation/native”;/”导入{StackActions}现在的
this.props.navigation.dispatch(StackActions.poptoop());

这将重置整个路由器,并将您放在一个屏幕上

const resetAction = StackActions.reset({ // import StackActions & NavigationActions from react-navigation
  index: 0,
  key: null, // this is important
  actions: [NavigationActions.navigate({ routeName: "ScreenName" })] // where you want to go after reset
});
this.props.navigation.dispatch(resetAction);
如果
StackActions
NavigationActions
未定义,则您可能在其他导航(如抽屉或选项卡)下使用它。
将此重置代码移动到
堆栈
交换机
路由器屏幕。

最后,我得到了答案。可能对那些陷入同样问题的人有所帮助。 主导航器必须配置为SwithNavigator。发件人:

SwitchNavigator的目的是一次只显示一个屏幕。默认情况下,它不处理后退操作,并在您切换时将路由重置为其默认状态。这正是我们希望从身份验证流中获得的行为:当用户登录时,我们希望丢弃身份验证流的状态并卸载所有屏幕,当我们按下hardware back按钮时,我们希望无法返回身份验证流。我们通过使用导航操作在SwitchNavigator中的路由之间切换

因此,我们的应用程序需要按照以下方式创建:

const AppNavigator = createSwitchNavigator(
    {
        OnBoard: OnBoardTabsNavigator,
        Logged: LoggedDrawerNavigator,
    }
);
然后,在注销屏幕中,配置以下注销功能:

_LogOut(){
    console.log("Logging out");
    AsyncStorage.clear() // <-- Don't forget to clear any variables stored on Async Storage
    .then(() => {
        this.props.navigation.navigate('SignIn')
    })
    .catch((err) => {
        console.log(err);
    })
}
\u注销(){
控制台日志(“注销”);

AsyncStorage.clear()//我没有收到任何错误,函数已执行(我有前后的日志)但是屏幕上没有变化,我不去主题,我更新了问题,添加了更多关于系统总体结构的信息navigators@FedericoCaccia堆栈必须在顶部。为什么堆栈必须在顶部?@Federicoccia您使用开关导航器解决了它。它解决了您的临时问题,但它不会堆叠。只有当堆栈是家长的导航器可以堆叠一堆屏幕。我将该代码放在抽屉导航器内屏幕设置中的注销功能上。抽屉导航器包含两个屏幕:设置和主页。我试图将用户重定向到导航器之外的登录屏幕(属于抽屉导航器的家长导航器)。我得到以下错误:未为密钥登录定义rout。必须是“设置”之一。我更新了问题,添加了有关导航器一般结构的更多信息,这就是为什么我告诉您它在选项卡或抽屉导航下不起作用。在堆栈屏幕内使用它,并使用道具或事件列表调用它。实际上,您需要将它放在主sta中ck navigator,将堆栈嵌套在抽屉中也不起作用,因为它将重置为仅其堆栈navigator,并且不会进一步上升。是的,它可以完美地工作,因为开关navigator将只渲染其中一个堆栈。