teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

8

補足

2020/02/22 08:06

投稿

popobot
popobot

スコア6588

answer CHANGED
@@ -1,4 +1,4 @@
1
- ※ 以下の回答は正しくありませんでした。
1
+ ※ 以下の回答は正しくありませんでした。`onAuthStateChanged`のStreamにおいては該当しません。
2
2
 
3
3
  ----
4
4
 

7

補足

2020/02/22 08:06

投稿

popobot
popobot

スコア6588

answer CHANGED
@@ -1,3 +1,9 @@
1
+ ※ 以下の回答は正しくありませんでした。
2
+
3
+ ----
4
+
5
+ **最初の回答**
6
+
1
7
  通常`Stream`は`StreamBuilder`等で複数回`listen()`できません。
2
8
  `StreamController.broadcast()`等~~`asBroadcastStream`~~を使って、`Broadcast`な`Stream`にすればできると思います。
3
9
 

6

補足

2020/02/22 08:05

投稿

popobot
popobot

スコア6588

answer CHANGED
@@ -19,6 +19,8 @@
19
19
  手元で検証したところ、`onAuthStateChanged` の `Stream` を複数回 listen しても問題なかったです。
20
20
  以下、検証したコードを貼っておきます。
21
21
 
22
+ なお、以下のコードで、 `userPage()`をさらに増やしてホットリロードすると、`ConnectionState.waiting`のままになる現象が再現しました。ビルドし直すと直ります。発生している現象はこれかもしれないです。
23
+
22
24
  ```
23
25
  import 'package:firebase_auth/firebase_auth.dart';
24
26
  import 'package:flutter/material.dart';

5

ログインのバグを修正...

2020/02/21 23:38

投稿

popobot
popobot

スコア6588

answer CHANGED
@@ -48,12 +48,16 @@
48
48
 
49
49
  @override
50
50
  void initState() {
51
- if (FirebaseAuth.instance.currentUser() == null) {
52
- FirebaseAuth.instance.signInAnonymously();
53
- }
54
51
  super.initState();
52
+ login();
55
53
  }
56
54
 
55
+ Future<void> login() async {
56
+ if (await FirebaseAuth.instance.currentUser() == null) {
57
+ await FirebaseAuth.instance.signInAnonymously();
58
+ }
59
+ }
60
+
57
61
  @override
58
62
  Widget build(BuildContext context) {
59
63
  return Container(

4

検証したコードを貼った...

2020/02/21 23:33

投稿

popobot
popobot

スコア6588

answer CHANGED
@@ -10,4 +10,98 @@
10
10
  > また、Flutter初心者で実装方法が合っているか不確かで、マイページのようにユーザー情報を表示する画面ではどのようにChangeNotifierで値を渡しているのかご教示いただけると大変嬉しいです。
11
11
  (ChangeNotifier以外でも良い方法があれば教えてください。。)
12
12
 
13
- ChangeNotifierなどの、状態を管理するライブラリとしては、 [provider](https://pub.dev/packages/provider)を使うのが一般的だと思います。もしご存じなければ、調べてみてもいいかもしれません。
13
+ ChangeNotifierなどの、状態を管理するライブラリとしては、 [provider](https://pub.dev/packages/provider)を使うのが一般的だと思います。もしご存じなければ、調べてみてもいいかもしれません。
14
+
15
+ ----
16
+
17
+ **2020-02-22 追記**
18
+
19
+ 手元で検証したところ、`onAuthStateChanged` の `Stream` を複数回 listen しても問題なかったです。
20
+ 以下、検証したコードを貼っておきます。
21
+
22
+ ```
23
+ import 'package:firebase_auth/firebase_auth.dart';
24
+ import 'package:flutter/material.dart';
25
+
26
+ void main() => runApp(MyApp());
27
+
28
+ class MyApp extends StatelessWidget {
29
+ @override
30
+ Widget build(BuildContext context) {
31
+ return MaterialApp(
32
+ title: 'Test',
33
+ home: Scaffold(
34
+ appBar: AppBar(),
35
+ body: MyHomePage(),
36
+ ),
37
+ );
38
+ }
39
+ }
40
+
41
+ class MyHomePage extends StatefulWidget {
42
+ @override
43
+ _MyHomePageState createState() => _MyHomePageState();
44
+ }
45
+
46
+ class _MyHomePageState extends State<MyHomePage> {
47
+ MyPageNotification myPageNotification = MyPageNotification();
48
+
49
+ @override
50
+ void initState() {
51
+ if (FirebaseAuth.instance.currentUser() == null) {
52
+ FirebaseAuth.instance.signInAnonymously();
53
+ }
54
+ super.initState();
55
+ }
56
+
57
+ @override
58
+ Widget build(BuildContext context) {
59
+ return Container(
60
+ child: Column(
61
+ children: [
62
+ userPage(),
63
+ userPage(),
64
+ ],
65
+ ),
66
+ );
67
+ }
68
+
69
+ Widget userPage() {
70
+ return StreamBuilder<User>(
71
+ stream: myPageNotification.user,
72
+ builder: (context, user) {
73
+ print(user);
74
+
75
+ return user.data == null
76
+ ? const CircularProgressIndicator()
77
+ : Text(user.data.uid);
78
+ },
79
+ );
80
+ }
81
+ }
82
+
83
+ class AuthApi {
84
+ //connect Firebase
85
+ final FirebaseAuth _auth = FirebaseAuth.instance;
86
+
87
+ //create user obj based on FirebaseUser
88
+ User _userFromFirebaseUser(FirebaseUser user) {
89
+ return user != null ? User(uid: user.uid) : null;
90
+ }
91
+
92
+ //auth change user stream
93
+ Stream<User> get user {
94
+ return _auth.onAuthStateChanged.map(_userFromFirebaseUser);
95
+ }
96
+ }
97
+
98
+ class MyPageNotification with ChangeNotifier {
99
+ //get user stream
100
+ Stream<User> user = AuthApi().user;
101
+ }
102
+
103
+ class User {
104
+ User({this.uid});
105
+ String uid;
106
+ }
107
+ ```

3

回答を訂正

2020/02/21 23:25

投稿

popobot
popobot

スコア6588

answer CHANGED
@@ -1,5 +1,5 @@
1
1
  通常`Stream`は`StreamBuilder`等で複数回`listen()`できません。
2
- `asBroadcastStream()`を使って、`Broadcast`な`Stream`にすればできると思います。
2
+ `StreamController.broadcast()`等~~`asBroadcastStream`~~を使って、`Broadcast`な`Stream`にすればできると思います。
3
3
 
4
4
  以下の記事が詳しく書かれていたので、参考にするといいと思います。
5
5
 

2

調整

2020/02/21 22:23

投稿

popobot
popobot

スコア6588

answer CHANGED
@@ -10,5 +10,4 @@
10
10
  > また、Flutter初心者で実装方法が合っているか不確かで、マイページのようにユーザー情報を表示する画面ではどのようにChangeNotifierで値を渡しているのかご教示いただけると大変嬉しいです。
11
11
  (ChangeNotifier以外でも良い方法があれば教えてください。。)
12
12
 
13
- ChangeNotifierなどの、状態を管理するライブラリとしては、 [provider](https://pub.dev/packages/provider)を使うのが一般的だと思います。
13
+ ChangeNotifierなどの、状態を管理するライブラリとしては、 [provider](https://pub.dev/packages/provider)を使うのが一般的だと思います。もしご存じなければ、調べてみてもいいかもしれません。
14
- もしご存じなければ、調べてみてもいいかもしれません。

1

補足

2020/02/21 08:55

投稿

popobot
popobot

スコア6588

answer CHANGED
@@ -1,8 +1,14 @@
1
1
  通常`Stream`は`StreamBuilder`等で複数回`listen()`できません。
2
2
  `asBroadcastStream()`を使って、`Broadcast`な`Stream`にすればできると思います。
3
3
 
4
+ 以下の記事が詳しく書かれていたので、参考にするといいと思います。
5
+
6
+ [Stream/Sinkを使いこなす! Stream/RxDart初心者のためのBLoC入門 part2](https://qiita.com/tetsufe/items/7b2f8592f5161104d1cd)
7
+
4
8
  ----
5
9
 
10
+ > また、Flutter初心者で実装方法が合っているか不確かで、マイページのようにユーザー情報を表示する画面ではどのようにChangeNotifierで値を渡しているのかご教示いただけると大変嬉しいです。
6
- 下の記事詳しく書かれていたので、参考にするといいと思います
11
+ (ChangeNotifier外でも良い方法ば教えください。。)
7
12
 
8
- [Stream/Sinkを使いこなす Stream/RxDart初心者のためのBLoC入門 part2](https://qiita.com/tetsufe/items/7b2f8592f5161104d1cd)
13
+ ChangeNotifierどの、状態を管理るライブラリとしては、 [provider](https://pub.dev/packages/provider)を使うのが一般的だと思います。
14
+ もしご存じなければ、調べてみてもいいかもしれません。