【 Flutter 】GoRouter の redirect に関するちょこっとメモ
context.go や context.push などで画面遷移をした場合
必ず redirect に引っかかると思います。
その際に null を返せていればリダイレクトされませんが
別の画面に遷移させたい場合はif文などの条件文を突っ込むとその画面に遷移できます。
これは認証していないユーザーが認証済みページを開いたときに
ログイン画面に飛ばす時に便利ですよね。僕も使ってます。
で、今回僕が躓いた箇所が
リダイレクトで指定したパスが再度リダイレクトされたという点です。
例えば、認証済みユーザーしか見れないページ
プロフィールページに認証していないユーザーが遷移したとします。
ただ、こちらとしては認証していないユーザーなので
ログイン画面に返したい訳です。
となると、リダイレクトでは認証していないユーザーは
ログイン画面に行ってください〜とします。
処理としては下記の感じ
redirect: (context, state) {
if( user is 未認証 ){
return '/login';
}
}
ただ、びっくりしたのが
この /login 処理を行った瞬間に再度リダイレクトされているのです。
ちょっと意味分かりづらいと思いますので
print関数を突っ込んでみました。
redirect: (context, state) {
+ print(state.location);
if( user is 未認証 ){
return '/login';
}
}
すると、下記の感じで結果が得られます。
/profile
/login
1回目の /profile は
ユーザーが未認証にも関わらず認証画面に遷移した時のパスです。
で、これが redirect によって /login に変更されます。
2回目の /login は、
上記で変更された /login を指します。
つまり、リダイレクトで指定したページに飛んだはずなのに
またリダイレクトされているという事ですね。
僕はこれでちょっと悩みました。
というか、これ一生ループするのでは?と思ったのですが
state.location と return で返すパスが一致する場合は
そのリダイレクトが終了するみたいですね。
へぇ〜。よく出来てるなぁ〜と思いました。以上!
Discussion