質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

0回答

2161閲覧

flutter firestoreでのStreamを用いたユーザーIDとユーザー情報の状態管理

mu-------

総合スコア9

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2020/03/28 13:29

Flutter初心者です!

FireStoreからログインしているユーザーIDを取得し、
そのユーザーIDを使用してユーザーの情報(UsersInfo)を再度FireStoreから取得しています。

ユーザーのログイン・ログアウトの状態は、
Streamで監視できるようにしています。

下記のようにStreamでログイン状態を監視しています。

dart

1AuthApi.dart 2 3 //create user obj based on FirebaseUser 4 User _userFromFirebaseUser(FirebaseUser user) { 5 return user != null ? User(uid: user.uid) : null; 6 } 7 8 //auth change user stream 9 Stream<User> get user { 10 return _auth.onAuthStateChanged.map(_userFromFirebaseUser); 11 }

また、UsersInfoの情報もStreamで監視しようとしています。

dart

1UsersInfoApi.dart 2 3 //user_info list from snapshot 4 UsersInfo _userInfoListFromSnapshot(DocumentSnapshot document) { 5 return UsersInfo( 6 nickname: document['nickname'] as String ?? '', 7 address: document['address'] as String ?? '', 8 age: document['age'] as int ?? 0, 9 ); 10 } 11 12 //get data 13 Stream<UsersInfo> get usersInfo { 14 return usersInfoCollection 15 .document(uid) // ここでユーザーIDを使用する 16 .snapshots() 17 .map(_userInfoListFromSnapshot); 18 }

そして、main.dartにて、Userのログイン情報とUsersInfoの情報をStreamProviderで渡し、
MaterialAppの配下にあるウィジェットに情報を渡したいと思っているのですが、
その方法がわかってません。。

要するに、下記のようなことができたら嬉しいのですが、このようにはできないことはわかっております(泣)

dart

1main.dart 2 3class MyApp extends StatelessWidget { 4 5 Widget build(BuildContext context) { 6 return MultiProvider( 7 providers: [ 8 StreamProvider<User>(    // ユーザーIDはこれでいいと思うのですが。。 9 create: (_) => AuthApi().user, 10 ), 11 StreamProvider<UsersInfo>( //このようなものはないのですが、できたらうれしいです。。 12 create: (_) => UsersInfoApi(uid:上から取得したユーザーID).usersInfo 13 ), 14 ], 15 child: MaterialApp( ...

現在は、ユーザーIDのみ上記方法で各ページに配布し、
各ページでStreamBuilderでUsersInfoをを取得しています。

それ以外にも、下記のような方法があると思うのですが、ユーザーがログアウトする度にMaterialAppが書き換わってもいいのでしょうか??

dart

1main.dart 2class MyApp extends StatelessWidget { 3 4 5 Widget build(BuildContext context) { 6 return MultiProvider( 7 providers: [ 8 StreamProvider<User>( 9 create: (_) => AuthApi().user, 10 ), 11 ], 12 child: Consumer<User>( 13 builder: (context, user, child) { 14 return StreamProvider<UsersInfo>( 15 create: (_) => UsersInfoApi(uid: user.uid).usersInfo, 16 child: MaterialApp( ...

また、アプリ全体ではChangeNotifierProviderで状態管理を行っているのですが、
そちらでユーザー情報も状態管理をした方がいいのでしょうか?
(やり方がわかっておらず、お手数ですが、例があると幸いです…!)

「自分はこのようにfirebaseでユーザー情報を管理してます!」という情報でも構いませんので、
ご回答、何卒よろしくお願い致します!!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問