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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Flutter

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

Q&A

0回答

617閲覧

Flutter for WebでFirebaseのFirestoreのデータを取得したいができない問題

ttkun

総合スコア30

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Flutter

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

0グッド

0クリップ

投稿2021/04/02 12:23

編集2021/04/02 12:24

現在Flutterの勉強をしているのですが、
コチラのサイトを参考にFlutterとVSCODEでFlutter Webアプリを作っています。
https://www.flutter-study.dev/

FlutterとFirebaseの使いかたを進めているのですが、こちらの記事の通りにやっているのですが、
全く表示されません。
https://www.flutter-study.dev/firebase-app/firestore

書いたコードはこちらです。原因を特定するためにはどのようなことをすればよいでしょうか?
必要なじょうほうなどあれば随時記入していきます。
よろしくお願いいたします。
(文字数が大きかったので上の部分だけ省略しています。)

main.dart

1省略 2省略 3 4class _LoginPageState extends State<LoginPage> { 5 // メッセージ表示用 6 String infoText = ''; 7 // 入力したメールアドレス・パスワード 8 String email = ''; 9 String password = ''; 10 11 @override 12 Widget build(BuildContext context) { 13 return Scaffold( 14 body: Center( 15 child: Container( 16 padding: EdgeInsets.all(24), 17 child: Column( 18 mainAxisAlignment: MainAxisAlignment.center, 19 children: <Widget>[ 20 // メールアドレス入力 21 TextFormField( 22 decoration: InputDecoration(labelText: 'メールアドレス'), 23 onChanged: (String value) { 24 setState(() { 25 email = value; 26 }); 27 }, 28 ), 29 // パスワード入力 30 TextFormField( 31 decoration: InputDecoration(labelText: 'パスワード'), 32 obscureText: true, 33 onChanged: (String value) { 34 setState(() { 35 password = value; 36 }); 37 }, 38 ), 39 Container( 40 padding: EdgeInsets.all(8), 41 // メッセージ表示 42 child: Text(infoText), 43 ), 44 Container( 45 width: double.infinity, 46 // ユーザー登録ボタン 47 child: ElevatedButton( 48 child: Text('ユーザー登録'), 49 onPressed: () async { 50 try { 51 final FirebaseAuth auth = FirebaseAuth.instance; 52 final result = await auth.createUserWithEmailAndPassword( 53 email: email, 54 password: password, 55 ); 56 // ユーザー登録に成功した場合 57 // チャット画面に遷移+ログイン画面を破棄 58 await Navigator.of(context).pushReplacement( 59 MaterialPageRoute(builder: (context) { 60 return ChatPage(result.user!); 61 }), 62 ); 63 } catch (e) { 64 // ユーザー登録に失敗した場合 65 setState( 66 () { 67 infoText = "登録に失敗しました:${e.toString()}"; 68 }, 69 ); 70 } 71 }, 72 ), 73 ), 74 const SizedBox(height: 8), 75 Container( 76 width: double.infinity, 77 // ログイン登録ボタン 78 child: OutlinedButton( 79 child: Text('ログイン'), 80 onPressed: () async { 81 try { 82 // メール/パスワードでログイン 83 final FirebaseAuth auth = FirebaseAuth.instance; 84 final result = await auth.signInWithEmailAndPassword( 85 email: email, 86 password: password, 87 ); 88 // ログインに成功した場合 89 // チャット画面に遷移+ログイン画面を破棄 90 await Navigator.of(context).pushReplacement( 91 MaterialPageRoute(builder: (context) { 92 return ChatPage(result.user!); 93 }), 94 ); 95 } catch (e) { 96 // ログインに失敗した場合 97 setState(() { 98 infoText = "ログインに失敗しました:${e.toString()}"; 99 }); 100 } 101 }), 102 ), 103 ], 104 ), 105 ), 106 ), 107 ); 108 } 109} 110 111// チャット画面用Widget 112class ChatPage extends StatelessWidget { 113 // 引数からユーザー情報を受け取れるようにする 114 ChatPage(this.user); 115 // ユーザー情報 116 final User user; 117 List<DocumentSnapshot> documentList = []; 118 @override 119 Widget build(BuildContext context) { 120 return Scaffold( 121 appBar: AppBar( 122 title: Text('チャット'), 123 actions: <Widget>[ 124 IconButton( 125 icon: Icon(Icons.logout), 126 onPressed: () async { 127 // ログアウト処理 128 // 内部で保持しているログイン情報等が初期化される 129 // (現時点ではログアウト時はこの処理を呼び出せばOKと、思うぐらいで大丈夫です) 130 await FirebaseAuth.instance.signOut(); 131 // ログイン画面に遷移+チャット画面を破棄 132 await Navigator.of(context).pushReplacement( 133 MaterialPageRoute(builder: (context) { 134 return LoginPage(); 135 }), 136 ); 137 }, 138 ), 139 ], 140 ), 141 body: Column( 142 children: [ 143 Container( 144 padding: EdgeInsets.all(8), 145 child: Text('ログイン情報:${user.email}'), 146 ), 147 Expanded( 148 // FutureBuilder 149 // 非同期処理の結果を元にWidgetを作れる 150 child: FutureBuilder<QuerySnapshot>( 151 // 投稿メッセージ一覧を取得(非同期処理) 152 // 投稿日時でソート 153 future: FirebaseFirestore.instance 154 .collection('posts') 155 .orderBy('date') 156 .get(), 157 builder: (context, snapshot) { 158 // データが取得できた場合 159 if (snapshot.hasData) { 160 final List<DocumentSnapshot> documents = snapshot.data!.docs; 161 // 取得した投稿メッセージ一覧を元にリスト表示 162 return ListView( 163 children: documents.map((document) { 164 return Card( 165 child: ListTile( 166 title: Text(document['text']), 167 subtitle: Text(document['email']), 168 // 自分の投稿メッセージの場合は削除ボタンを表示 169 trailing: document['email'] == user.email 170 ? IconButton( 171 icon: Icon(Icons.delete), 172 onPressed: () async { 173 // 投稿メッセージのドキュメントを削除 174 await FirebaseFirestore.instance 175 .collection('posts') 176 .doc(document.id) 177 .delete(); 178 }, 179 ) 180 : null, 181 ), 182 ); 183 }).toList(), 184 ); 185 } 186 // データが読込中の場合 187 return Center( 188 child: Text('読込中...'), 189 ); 190 }, 191 ), 192 ), 193 ], 194 ), 195 floatingActionButton: FloatingActionButton( 196 child: Icon(Icons.add), 197 onPressed: () async { 198 await Navigator.of(context).push( 199 MaterialPageRoute( 200 builder: (context) { 201 return AddPostPage(this.user); 202 }, 203 ), 204 ); 205 }, 206 ), 207 ); 208 } 209} 210 211class AddPostPage extends StatefulWidget { 212 // 引数からユーザー情報を受け取る 213 AddPostPage(this.user); 214 // ユーザー情報 215 final User user; 216 217 @override 218 _AddPostPageState createState() => _AddPostPageState(); 219} 220 221// 投稿画面用Widget 222class _AddPostPageState extends State<AddPostPage> { 223 // 入力した投稿メッセージ 224 String messageText = ''; 225 226 @override 227 Widget build(BuildContext context) { 228 return Scaffold( 229 appBar: AppBar( 230 title: Text('チャット投稿'), 231 ), 232 body: Center( 233 child: Container( 234 padding: EdgeInsets.all(32), 235 child: Column( 236 mainAxisAlignment: MainAxisAlignment.center, 237 children: <Widget>[ 238 // 投稿メッセージ入力 239 TextFormField( 240 decoration: InputDecoration(labelText: '投稿メッセージ'), 241 // 複数行のテキスト入力 242 keyboardType: TextInputType.multiline, 243 // 最大3行 244 maxLines: 3, 245 onChanged: (String value) { 246 setState(() { 247 messageText = value; 248 }); 249 }, 250 ), 251 const SizedBox(height: 8), 252 Container( 253 width: double.infinity, 254 child: ElevatedButton( 255 child: Text('投稿'), 256 onPressed: () async { 257 // 現在の日時 258 final date = DateTime.now().toLocal().toIso8601String(); 259 // AddPostPage のデータを参照 260 final email = widget.user.email; 261 // 投稿メッセージ用ドキュメント作成 262 await FirebaseFirestore.instance 263 // コレクションID指定 264 .collection('posts') 265 // ドキュメントID自動生成 266 .doc() 267 .set({ 268 'text': messageText, 269 'email': email, 270 'date': date 271 }); 272 // 1つ前の画面に戻る 273 Navigator.of(context).pop(); 274 }, 275 ), 276 ) 277 ], 278 ), 279 ), 280 ), 281 ); 282 } 283}

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

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

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

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

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

satokei

2021/04/09 10:32

『全く表示されません。』とありますが、何が表示されないのですか?  (例)画面自体が表示されない、投稿したメッセージが表示されない など またエラーメッセージなども出力されていないのですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問