🫥

AsyncLoading<T> class & isLoading property

2024/08/01に公開

Tips💡

AsyncLoading<T> classisLoading propertyを使う機会があったので調べてみた。

🐞AsyncLoading<T> class

読み込み状態で AsyncValue を作成します。

このコンストラクタは常に const キーワードとともに使用することをお勧めします。

継承
Object AsyncValue<T> AsyncLoading

このクラスが持っている

を今回は使う機会がありました。読み込みに使うゲッターのようです。

🐞isLoading property

新しい値が現在非同期的にロード中かどうか。

isLoading が true であっても、hasValue/hasError も true になる可能性があります。

Implementation


bool get isLoading => true;

💁‍♀️使った例

認証機能を実装していたときに、AsyncValueを使っていたので、使用する機会がありました。
こちらの記事で紹介してます

認証用のプロバイダーを定義する:
isLoadingという変数のなかで、 authState.isLoadingと書いてゲッターを呼び出してます。これは変数ではなくて、メソッドです。

// Package imports:
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:supabase_flutter/supabase_flutter.dart';

part 'auth_provider.g.dart';


Stream<AuthState> authState(AuthStateRef ref) {
  return Supabase.instance.client.auth.onAuthStateChange;
}

GoRouterのリダイレクトの処理で使う:

final GlobalKey<NavigatorState> _rootNavigatorKey =
    GlobalKey<NavigatorState>(debugLabel: 'root');

final GlobalKey<NavigatorState> _sectionANavigatorKey =
    GlobalKey<NavigatorState>(debugLabel: 'sectionANav');


GoRouter router(RouterRef ref) {
  final authState = ref.watch(authStateProvider);
  final isLoading = authState.isLoading;

  return GoRouter(
    // firebase analyticsを使用するためのobserver
    // observerを使用することで、画面遷移のイベントをfirebase analyticsに送信することができる
    observers: [
      FirebaseAnalyticsObserver(analytics: FirebaseAnalytics.instance)
    ],
    navigatorKey: _rootNavigatorKey,
    initialLocation: RouterPath.SIGN_IN,
    redirect: (context, state) async {
      // アプリの初期化や認証状態の確認が完了するまで、ローディング画面を表示
      if (isLoading) {
        return RouterPath.LOADING;
      }

      // ログインしているかどうかを確認するプロパティ
      final loggedIn = authState.value?.session?.user != null;
      // JWTトークンがExpiredしているか確認するプロパティ
      final isExpired = authState.value?.session?.isExpired;

      switch (state.matchedLocation) {
        case RouterPath.SIGN_IN:
          if (loggedIn && !(isExpired ?? true)) {
            return RouterPath.HOME;
          } else {
            return RouterPath.SIGN_IN;
          }
        default:
          return null;
      }
    },

まとめ

「読み込み状態で AsyncValue を作成します。」とリファレンスには書いてありました。データをロード中に、安全に非同期処理でデータを作ってくれるということでしょうかね。

Discussion