😸

Flutter Web ✖️ GoRouter 認証の流れ

2023/02/10に公開

ぶっちゃけ備忘録なので、見てもあまり良い事ないかもしれないです・・・
そのうち、綺麗に書きますのでそれまではただのメモです。

URLが検索されたときの処理

候補1

redirectの中で、認証をする
これだと、認証中ダイアログなどが出せない

redirectの中で非同期書をあまりしたくない。
1.xxxのバージョンとかでは非同期処理がなかった気がする。

候補2

とりあえず、splashみたいなpathに飛ばして、その中で初期認証を行う
その後、それに応じて画面遷移する
ただ、このやり方だと、view model にcontextを持っていく必要がありそうでアンチパターンでは?と思っている

候補3

認証は後回しにして、authStateをstreamProviderで監視をする
そのstreamデータが更新されるごとに画面が変更する(リダイレクト上で)

ただこれだと、認証が完了するまでに3秒くらいのタイムラグがあるから
その3秒間がloginページとかに飛んでしまっている可能性がありそう。

候補4

main関数内でFirebaseの初期化処理をしているから、
FirebaseAuth.currentUser が null かどうかで判断するのもあり。

その他の画面遷移では、基本的にauthStateChangesを当てないしない方針になりそうだけど。

firebaseUser != nullのときの処理:
UserInfoが無い場合は取得してしまっても良い気がする。

redirect処理
redirect {
  if(firebaseUser == null) return '/login';
  
  if(userInfo == null){
    await ref.read(userInfoFutureProvider).when(
    data: (data) => null,
    error: (error) => error,
    loading: () =>  '/splash';
    );
  }
  
  return null;
}

Discussion