FirebaseAuth.instanceを使って取得するcurrentUserにはラグがあるのと無いのと2つあるから気をつけて。

2023/01/10に公開

FirebaseAuth.instance.currentUserに、
本来はUserデータが入っているはずなのに、nullになっている場合がある。
それを心配するきっかけになった記事がこちら。

https://zenn.dev/kboy/articles/4c398560a2518f

この記事曰く、
リロードの関係で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, or null 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