FirebaseAuth.instanceを使って取得するcurrentUserにはラグがあるのと無いのと2つあるから気をつけて。
FirebaseAuth.instance.currentUserに、
本来はUserデータが入っているはずなのに、nullになっている場合がある。
それを心配するきっかけになった記事がこちら。
この記事曰く、
リロードの関係でcurrentUserにデータが入らない場合があるらしい。
で、実際に試してみると、
その現象が見受けられるcurrentUserと
最初から入っていたcurrentUserの2種類が存在した。
(はぁ、ややこしい。。。)
先に、記事の方のcurrentUser、つまり取得しない場合の方を説明すると、
以下を監視している場合にその現象は起きました。
FirebaseAuth.instance.authStateChanges();
説明文
Notifies about changes to the user's sign-in state (such as sign-in or sign-out).
翻訳:ユーザーのサインイン状態の変化(サインインやサインアウトなど)について通知します。
まぁ、書いてある通りなので僕が説明するまでもなく、
userの認証状態を監視して、変更が確認されたら通知しますよ〜って言ってるだけ。何も難しくはない。
で、こいつは恐らくやけど、取得するのにラグが発生している可能性が高い。
だから、何回やっても正確なcurrentUserを取得するのに時間がかかり
1.5 ~ 2秒ほどのラグが発生する。
で、対照的にラグがなく取得している方はこちら↓
FirebaseAuth.instance.currentUser;
説明文
Returns the current [User] if they are currently signed-in, ornull
if not.
This getter only provides a snapshot of user state. Applications that need to react to changes in user state should instead use [authStateChanges], [idTokenChanges] or [userChanges] to subscribe to updates.翻訳:
現在の[User]がサインインしていればそのユーザーを、そうでなければnull
を返します。
このゲッターはユーザーの状態のスナップショットを提供するだけです。ユーザーの状態の変化に反応する必要があるアプリケーションは、代わりに [authStateChanges]、 [idTokenChanges] または [userChanges] を使用して更新を購読してください。
こいつにはラグとかなく普通にちゃんと取得できている。
そもそも何故currentUserが同期処理なのか
これは疑問に思った。なんでなんやろうと。
でも、それはインスタンスのプロパティやから、そらそうかと納得した。
で、問題はそのFirebaseAuth.instanceが何故、非同期処理では無いのかと思って調べてみると
下記の一文を見つけた。
Returns an instance using the default [FirebaseApp].
翻訳:デフォルトの [FirebaseApp] を使用したインスタンスを返します。
あぁ、確かにmain関数でFirebase.initializeAppを非同期処理でやってたわ。
これの事かぁと思って納得した。
要は、既にfirebaseを使う上での全体的な初期化処理をしていて、
その際にcurrentUserのデータをクラウドから取得してるんだろうなと。
メモからも分かるように、currentUserを取得するには、
非同期処理だから、やっぱりFirebase.initialAppを非同期処理してる間に取得しているのだろう。
結果
FirebaseAuth.insntance.currentUserは非同期処理では無いので
取得にラグは発生しない。
ただし、main関数とかでFirebase.initialAppを非同期処理を必ず行う事。
という事がわかった。
authStateChangesにラグが発生する理由はよく分からん。
コーヒー奢るから誰か教えてくださいmm
Discussion