実現したいこと
ログアウト後にStreamProviderのキャッシュを削除して、再ログイン後ログインユーザーのコンテンツが表示されるようにする。
発生している問題・分からないこと
RiverpodのStreamProviderでFirebase Firestoreからの情報を表示させるプログラムを実装中です。
ログアウト後、「flutter: [cloud_firestore/permission-denied] The caller does not have permission to execute the specified operation.」が発生しています。これはFirebase Firestoreのセキュリティルールによるものでログインしていないユーザーがアクセスしようとしているので挙動としては想定内です。
問題なのは、ログアウト後にもFirebase Firestoreへアクセスして情報の取得を試みてしまっていることです。私の認識としては、ログアウト後にはアクセスはしていかないものと考えています。私がお聞きしたいのはStreamProviderのキャッシュを削除する適切な方法などはありますか?ということです。現状1回目のログインではログインユーザーのコンテンツが表示されていますが、2回目以降は「flutter: [cloud_firestore/permission-denied] The caller does not have permission to execute the specified operation.」が表示されてしまっています。
該当のソースコード
Dart
1final postProvider = StreamProvider<List<Post>>(2 (_) {3 return FirebaseFirestore.instance.collection('users')4 .doc(AuthService.myAccount!.id)5 .collection('my_posts')6 .orderBy('created_time', descending: true)7 .snapshots()8 .map((snapshot) =>9 snapshot.docs.map((doc) => Post.fromMap(doc.data())).toList());10 },11);12 13 14class Logout extends ConsumerWidget {15 const Logout({super.key});16 17 18 Widget build(BuildContext context, WidgetRef ref) {19 return Scaffold(20 body: Padding(21 padding: const EdgeInsets.all(16.0),22 // ログアウト項目23 child: ListTile(24 // ログアウトアイコン25 leading: const Icon(Icons.logout),26 title: const Text(27 "ログアウト",28 style: TextStyle(29 fontWeight: FontWeight.bold,30 ),31 ),32 // ログアウト処理を実行し、ログイン画面に遷移33 onTap: () {34 ref.invalidate(postProvider);35 // ログアウト処理を実行36 FirebaseAuth.instance.signOut();37 },38 ),39 ),40 );41 }42}43
試したこと・調べたこと
上記の詳細・結果
import 'package:feed_app/models/post.dart'; import 'package:feed_app/utils/auth_service.dart'; import 'package:feed_app/utils/firestore/user_firestore.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; final postProvider = StreamProvider.autoDispose<List<Post>>( (_) { return UserFirestore() .users .doc(AuthService.myAccount!.id) .collection('my_posts') .orderBy('created_time', descending: true) .snapshots() .map((snapshot) => snapshot.docs.map((doc) => Post.fromMap(doc.data())).toList()); }, );
postProviderをStreamProvider<List<Post>>ではなく、上記のStreamProvider.autoDispose<List<Post>>で書き換えたものの、アクセスするたびにローディングが実行されてしまうためキャッシュを保持しているメリットがなくなってしまうし、問題点である「ログアウト後にもFirebase Firestoreへアクセスして情報の取得を試みてしまっている」は解消されていないので本質的な解決には至りませんでした。
補足
[✓] Flutter (Channel stable, 3.16.3, on macOS 14.3.1 23D60 darwin-x64, locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 32.1.0-rc1)
[✓] Xcode - develop for iOS and macOS (Xcode 15.3)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2021.2)
[✓] VS Code (version 1.87.2)
[✓] Connected device (3 available)
[✓] Network resources
• No issues found!
0 コメント