質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
React Native

React Nativeは、ネイティブモバイルアプリ(iOS/Android)を作成できるJavaScriptフレームワークです。Reactと同じ設計のため、宣言的なコンポーネントでリッチなUIを開発することが可能です。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

917閲覧

ReactNativeでログアウト後にログイン画面に戻らない

shuhei-o

総合スコア2

React Native

React Nativeは、ネイティブモバイルアプリ(iOS/Android)を作成できるJavaScriptフレームワークです。Reactと同じ設計のため、宣言的なコンポーネントでリッチなUIを開発することが可能です。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/12/06 09:02

前提・実現したいこと

ReactNativeでアプリのフロントエンドを作成しています。
ログイン・ログアウトができるのですが、アプリのタスクを切った後にもう一度起動して、
ログアウトをすると、ログイン画面に戻りません。
正常な動きは以下になります。
ログイン画面でログイン→アカウントページに入る→ログアウトする→ログイン画面に戻る

しかし、
ログイン画面でログイン→アカウントページに入る→アプリのタスクを切る→アプリを起動→アカウントページに入る
→ログアウトする→returnで返しているページが表示される
というふうになってしまいます。

該当のソースコード

最初の読み込み画面

Javascript

1const AppNavContainer = ()=>{ 2 3 const {authState:{isLoggedIn}} = useContext(GlobalContext); 4 5 const [isAuthenticated, setIsAuthenticated] = useState(isLoggedIn); 6 const [authLoaded, setAuthLoaded] = useState(false); 7 8 const getUser = async ()=>{ 9 try{ 10 const user = await AsyncStorage.getItem('email'); 11 if(user){ 12 setAuthLoaded(true); 13 setIsAuthenticated(true); 14 } 15 else{ 16 setAuthLoaded(true); 17 setIsAuthenticated(false); 18 } 19 }catch(error){} 20 }; 21 /* 22 useEffect(()=>{ 23 SplashScreen.hide(); 24 },[]); 25 */ 26 27 useEffect(()=>{ 28 getUser(); 29 }, [isLoggedIn]); 30 31 return ( 32 <> 33 {authLoaded ? ( 34 <NavigationContainer> 35 36 {isAuthenticated ? <BottomNavigator />:<AuthNavigator />} 37 38 </NavigationContainer> 39 ):( 40 <ActivityIndicator /> 41 )} 42 </> 43 ) 44} 45 46export default AppNavContainer;

ログアウト画面

Javascript

1const Logout = () => { 2 const {authDispatch} = useContext(GlobalContext); 3 4 useEffect(() => { 5 logoutUser()(authDispatch); 6 }, []); 7 8 return ( 9 10 <ActivityIndicator /> 11 12 ); 13}; 14 15export default Logout;

logoutUser.js

Javascript

1 2export default () => dispatch =>{ 3 AsyncStorage.removeItem('access_token'); 4 AsyncStorage.removeItem('refresh_token'); 5 AsyncStorage.removeItem('email'); 6 dispatch({ 7 type:'LOGOUT_USER', 8 }) 9 10}

dispatch type:'LOGOUT_USER'の箇所

case 'LOGOUT_USER': return { ...state, loading: false, data: null, isLoggedIn:false, }

教えていただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/12/06 16:37

state の構造は authState の中に isLoggedIn があることになってる気がしますが、dispatch type:'LOGOUT_USER' の処理では state のトップレベルに isLoggedIn: false を設定してるような…。
shuhei-o

2021/12/09 01:55

isLoggedInの初期値をFalseに設定していて、アプリを落とすたびにその初期値になってしまっていたようです、、、
guest

回答1

0

自己解決

isLoggedInの初期値をFalseに設定していて、アプリを落とすたびにその初期値になってしまっていたようです、、、
アプリを落としてもログインされている場合は、isLoggedInをTrueにしておくことで、ログアウトした時に、isLoggedInがTrueに変わるようになったので、

useEffect(()=>{ getUser(); }, [isLoggedIn]);

ここが正常に機能するようになりました。

投稿2021/12/09 01:57

shuhei-o

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問