🫥
AsyncLoading<T> class & isLoading property
Tips💡
AsyncLoading<T> classのisLoading propertyを使う機会があったので調べてみた。
🐞AsyncLoading<T> class
読み込み状態で AsyncValue を作成します。
このコンストラクタは常に const キーワードとともに使用することをお勧めします。
継承
Object AsyncValue<T> AsyncLoading
このクラスが持っている
を今回は使う機会がありました。読み込みに使うゲッターのようです。
🐞isLoading property
新しい値が現在非同期的にロード中かどうか。
isLoading が true であっても、hasValue/hasError も true になる可能性があります。
Implementation
get isLoading => true;
bool
💁♀️使った例
認証機能を実装していたときに、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