0

我試圖用我的應用程序實現登錄/註銷功能,使用前導航:陣營與標籤本地導航註銷功能

render() { 
    return (
     <TabNavigation tabBarHeight={56} initialTab="devices"> 
     <TabNavigationItem 
      id="devices" 
      renderIcon={isSelected => this._renderIcon('hdd-o', isSelected)}> 
      <StackNavigation initialRoute="devices" defaultRouteConfig={{ 
           navigationBar: { 
            backgroundColor: '#B67075', 
            tintColor: 'white', 
           }, 
           }}/> 
     </TabNavigationItem> 

     <TabNavigationItem 
      id="rules" 
      renderIcon={isSelected => this._renderIcon('book', isSelected)}> 
      <StackNavigation initialRoute="rules" defaultRouteConfig={{ 
           navigationBar: { 
            backgroundColor: '#B67075', 
            tintColor: 'white', 
           }, 
           }}/> 
     </TabNavigationItem> 
     <TabNavigationItem 
      id="settings" 
      renderIcon={isSelected => this._renderIcon('cog', isSelected)}> 
      <StackNavigation initialRoute="settings" defaultRouteConfig={{ 
           navigationBar: { 
            backgroundColor: '#B67075', 
            tintColor: 'white', 
           }, 
           }}/> 
     </TabNavigationItem> 
     </TabNavigation> 

但是,如果我試圖註銷的TabNavigationItem的一個時屏幕,頁面內的標籤導航登出,而不是整個頁面。基本上,我在設置頁面(第三個選項卡)上有一個註銷按鈕,當我註銷時,該選項卡會回到登錄屏幕,而標籤欄仍然存在。這是該設置組件中的功能:

logout =() => { 
    firebase.auth().signOut().then(() => { 
     this.props.navigator.push(Router.getRoute('goodbye')); 
}).catch(function(error) { 
    // An error happened. 
}); 
    } 

是否有不同的導航器功能從整個選項卡視圖導航?有沒有一個監聽器或我應該添加到父級選項卡導航組件的東西?

回答

0

這是我如何處理應用程序的登錄輸入/輸出。 在Main.js或App.js我添加此

signout(){ 
    AsyncStorage.clear(); // to clear the token 
    this.setState({loggedIn:false}); 
} 

...在componentWillMount

AsyncStorage.getItem('token').then((token) => { 
     if (token) { 
     this.setState({loggedIn: true}) 
     } else { 
     console.log('No user yet Created'); 
     } 
    }) 

...在渲染功能添加這些

if (this.state.loggedIn) { 
    // pass the signout function to where you want to signout from. 
    return <MainNavigator signOut={this.signout.bind(this)} />;  
} 
    return <AuthPage/>; 
} 

希望這幫助!

0

您應該App.js/index.js有登錄頁面沒有的標籤導航,所以加載登錄頁面。

<NavigationProvider router={AppRouter}> 
    <StackNavigation 
    id="root" 
    initialRoute={Router.getRoute('login')} 
    /> 
</NavigationProvider> 

Router.js

export const Router = createRouter(() => ({ 
    'login':() => Login, 
    'main':() => Main, 
}) 

然後如果你想進入主(頁面標籤導航)從登錄,您應該重置頁,而不是推來處理回的Android按鈕(當然你不想回回到登錄頁面喲登錄後)

添加此登錄功能

this.props.navigator.immediatelyResetStack([Router.getRoute('main')], 0); 

然後在設置頁面,而不是使用推從導航您應該重新設定導航

logout =() => { 
    firebase.auth().signOut().then(() => { 
    this.props.navigator.immediatelyResetStack([Router.getRoute('goodbye')], 0); 
    }).catch(function(error) { 
    // An error happened. 
    }); 
} 

這種方式,你有標籤的項目你自己的堆棧導航和堆棧導航的頁面導航(登錄標籤導航頁,回登錄,或再見頁)