回答編集履歴

8

補足

2020/02/22 08:06

投稿

popobot
popobot

スコア6586

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

7

補足

2020/02/22 08:06

投稿

popobot
popobot

スコア6586

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

6

補足

2020/02/22 08:05

投稿

popobot
popobot

スコア6586

test CHANGED
@@ -40,6 +40,10 @@
40
40
 
41
41
 
42
42
 
43
+ なお、以下のコードで、 `userPage()`をさらに増やしてホットリロードすると、`ConnectionState.waiting`のままになる現象が再現しました。ビルドし直すと直ります。発生している現象はこれかもしれないです。
44
+
45
+
46
+
43
47
  ```
44
48
 
45
49
  import 'package:firebase_auth/firebase_auth.dart';

5

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

2020/02/21 23:38

投稿

popobot
popobot

スコア6586

test CHANGED
@@ -98,14 +98,22 @@
98
98
 
99
99
  void initState() {
100
100
 
101
+ super.initState();
102
+
103
+ login();
104
+
105
+ }
106
+
107
+
108
+
109
+ Future<void> login() async {
110
+
101
- if (FirebaseAuth.instance.currentUser() == null) {
111
+ if (await FirebaseAuth.instance.currentUser() == null) {
102
-
112
+
103
- FirebaseAuth.instance.signInAnonymously();
113
+ await FirebaseAuth.instance.signInAnonymously();
104
114
 
105
115
  }
106
116
 
107
- super.initState();
108
-
109
117
  }
110
118
 
111
119
 

4

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

2020/02/21 23:33

投稿

popobot
popobot

スコア6586

test CHANGED
@@ -23,3 +23,191 @@
23
23
 
24
24
 
25
25
  ChangeNotifierなどの、状態を管理するライブラリとしては、 [provider](https://pub.dev/packages/provider)を使うのが一般的だと思います。もしご存じなければ、調べてみてもいいかもしれません。
26
+
27
+
28
+
29
+ ----
30
+
31
+
32
+
33
+ **2020-02-22 追記**
34
+
35
+
36
+
37
+ 手元で検証したところ、`onAuthStateChanged` の `Stream` を複数回 listen しても問題なかったです。
38
+
39
+ 以下、検証したコードを貼っておきます。
40
+
41
+
42
+
43
+ ```
44
+
45
+ import 'package:firebase_auth/firebase_auth.dart';
46
+
47
+ import 'package:flutter/material.dart';
48
+
49
+
50
+
51
+ void main() => runApp(MyApp());
52
+
53
+
54
+
55
+ class MyApp extends StatelessWidget {
56
+
57
+ @override
58
+
59
+ Widget build(BuildContext context) {
60
+
61
+ return MaterialApp(
62
+
63
+ title: 'Test',
64
+
65
+ home: Scaffold(
66
+
67
+ appBar: AppBar(),
68
+
69
+ body: MyHomePage(),
70
+
71
+ ),
72
+
73
+ );
74
+
75
+ }
76
+
77
+ }
78
+
79
+
80
+
81
+ class MyHomePage extends StatefulWidget {
82
+
83
+ @override
84
+
85
+ _MyHomePageState createState() => _MyHomePageState();
86
+
87
+ }
88
+
89
+
90
+
91
+ class _MyHomePageState extends State<MyHomePage> {
92
+
93
+ MyPageNotification myPageNotification = MyPageNotification();
94
+
95
+
96
+
97
+ @override
98
+
99
+ void initState() {
100
+
101
+ if (FirebaseAuth.instance.currentUser() == null) {
102
+
103
+ FirebaseAuth.instance.signInAnonymously();
104
+
105
+ }
106
+
107
+ super.initState();
108
+
109
+ }
110
+
111
+
112
+
113
+ @override
114
+
115
+ Widget build(BuildContext context) {
116
+
117
+ return Container(
118
+
119
+ child: Column(
120
+
121
+ children: [
122
+
123
+ userPage(),
124
+
125
+ userPage(),
126
+
127
+ ],
128
+
129
+ ),
130
+
131
+ );
132
+
133
+ }
134
+
135
+
136
+
137
+ Widget userPage() {
138
+
139
+ return StreamBuilder<User>(
140
+
141
+ stream: myPageNotification.user,
142
+
143
+ builder: (context, user) {
144
+
145
+ print(user);
146
+
147
+
148
+
149
+ return user.data == null
150
+
151
+ ? const CircularProgressIndicator()
152
+
153
+ : Text(user.data.uid);
154
+
155
+ },
156
+
157
+ );
158
+
159
+ }
160
+
161
+ }
162
+
163
+
164
+
165
+ class AuthApi {
166
+
167
+ //connect Firebase
168
+
169
+ final FirebaseAuth _auth = FirebaseAuth.instance;
170
+
171
+
172
+
173
+ //create user obj based on FirebaseUser
174
+
175
+ User _userFromFirebaseUser(FirebaseUser user) {
176
+
177
+ return user != null ? User(uid: user.uid) : null;
178
+
179
+ }
180
+
181
+
182
+
183
+ //auth change user stream
184
+
185
+ Stream<User> get user {
186
+
187
+ return _auth.onAuthStateChanged.map(_userFromFirebaseUser);
188
+
189
+ }
190
+
191
+ }
192
+
193
+
194
+
195
+ class MyPageNotification with ChangeNotifier {
196
+
197
+ //get user stream
198
+
199
+ Stream<User> user = AuthApi().user;
200
+
201
+ }
202
+
203
+
204
+
205
+ class User {
206
+
207
+ User({this.uid});
208
+
209
+ String uid;
210
+
211
+ }
212
+
213
+ ```

3

回答を訂正

2020/02/21 23:25

投稿

popobot
popobot

スコア6586

test CHANGED
@@ -1,6 +1,6 @@
1
1
  通常`Stream`は`StreamBuilder`等で複数回`listen()`できません。
2
2
 
3
- `asBroadcastStream()`を使って、`Broadcast`な`Stream`にすればできると思います。
3
+ `StreamController.broadcast()`等~~`asBroadcastStream`~~を使って、`Broadcast`な`Stream`にすればできると思います。
4
4
 
5
5
 
6
6
 

2

調整

2020/02/21 22:23

投稿

popobot
popobot

スコア6586

test CHANGED
@@ -22,6 +22,4 @@
22
22
 
23
23
 
24
24
 
25
- ChangeNotifierなどの、状態を管理するライブラリとしては、 [provider](https://pub.dev/packages/provider)を使うのが一般的だと思います。
25
+ ChangeNotifierなどの、状態を管理するライブラリとしては、 [provider](https://pub.dev/packages/provider)を使うのが一般的だと思います。もしご存じなければ、調べてみてもいいかもしれません。
26
-
27
- もしご存じなければ、調べてみてもいいかもしれません。

1

補足

2020/02/21 08:55

投稿

popobot
popobot

スコア6586

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