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

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

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

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

Flutter

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

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Dart

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

Q&A

2回答

4273閲覧

Flutter Firestoreからの非同期処理でのデータ取得について

mu-------

総合スコア9

Firebase

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

Flutter

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

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Dart

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

0グッド

0クリップ

投稿2020/04/06 03:47

編集2020/04/06 03:49

Flutter・Firestore初心者です。

Firestoreからデータを取るため、下記のように「投稿リスト」を取って来ようとしています。
しかし、for文の中の非同期処理が上手くいっていないのか、ずっとreturnされないまま止まってしまいます。
Firestoreにドキュメントのリファレンスを格納しており、そのリファレンスデータを取ってくるのに、for文を使用しています。

dart

1 // ここのリストを取ってきて表示させたい!! 2 Future<List<Post>> get list async { 3 return usersInfoCollection 4 .document(uid) 5 .collection('likedPosts') 6 .orderBy('createdAt', descending: true) 7 .limit(10) 8 .getDocuments() 9 .then(_userPostListFromSnapshot) 10 .catchError((Exception e) => print('userLikedList error:$e')); 11 } 12 13 Future<List<Post>> _listFromSnapshot(QuerySnapshot collection) async { 14 final posts = <Post>[]; 15 try { 16 // ここのfor文が非同期処理でうまくいっていない?? 17 for (final document in collection.documents) { 18 final ref = db.document(document['postRef'].toString()); 19 await ref.get().then((docPost) { 20 final post = Post( 21 nickname: docPost['nickname'] as String ?? '', 22 createdAt: docPost['createdAt'] as Timestamp, 23 updatedAt: docPost['updatedAt'] as Timestamp, 24 postId: docPost.documentID, 25 ); 26 posts.add(post); 27 }).catchError((Exception e) { 28 Fluttertoast.showToast(msg: '投稿取得中にエラーが発生しました。'); 29 print('Error liked_post_api._userPostListFromSnapshot :$e'); 30 }); 31 } 32 } on Exception catch (e) { 33 print('futurelist error:$e'); 34 } 35 return posts; 36 }

なぜか、この「list」を使用する画面でホットリロードを行うと、上手く表示され、別の画面でホットリロードして「list」を使用する画面に遷移すると失敗してしまいます。。

エラーは下記のものが出力されます。

E/flutter (26375): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: Invalid argument (onError): Error handler must accept one Object or one Object and a StackTrace as arguments, and return a a valid result: Closure: (Exception) => Null E/flutter (26375): #0 _registerErrorHandler (dart:async/future_impl.dart:809:3) E/flutter (26375): #1 Future.catchError (dart:async/future_impl.dart:304:17) E/flutter (26375): #2 LikedPostApi._awaitPostListGet (package:scrum/models/api/liked_post_api.dart:40:12) E/flutter (26375): #3 _AsyncAwaitCompleter.start (dart:async-patch/async_patch.dart:45:6) E/flutter (26375): #4 LikedPostApi._awaitPostListGet (package:scrum/models/api/liked_post_api.dart:17:39) E/flutter (26375): #5 LikedPostApi._userPostListFromSnapshot (package:scrum/models/api/liked_post_api.dart:14:12) E/flutter (26375): #6 _AsyncAwaitCompleter.start (dart:async-patch/async_patch.dart:45:6) E/flutter (26375): #7 LikedPostApi._userPostListFromSnapshot (package:scrum/models/api/liked_post_api.dart:13:47) E/flutter (26375): #8 _rootRunUnary (dart:async/zone.dart:1134:38) E/flutter (26375): #9 _CustomZone.runUnary (dart:async/zone.dart:1031:19) E/flutter (26375): #10 _FutureListener.handleValue (dart:async/future_impl.dart:139:18) E/flutter (26375): #11 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:680:45) E/flutter (26375): #12 Future._propagateToListeners (dart:async/future_impl.dart:709:32) E/flutter (26375): #13 Future._completeWithValue (dart:async/future_impl.dart:524:5) E/flutter (26375): #14 _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:32:15) E/flutter (26375): #15 _completeOnAsyncReturn (dart:async-patch/async_patch.dart:290:13) E/flutter (26375): #16 Query.getDocuments (package:cloud_firestore/src/query.dart) E/flutter (26375): #17 _asyncThenWrapperHelper.<anonymous closure> (dart:async-patch/async_patch.dart:73:64) E/flutter (26375): #18 _rootRunUnary (dart:async/zone.dart:1134:38) E/flutter (26375): #19 _CustomZone.runUnary (dart:async/zone.dart:1031:19) E/flutter (26375): #20 _FutureListener.handleValue (dart:async/future_impl.dart:139:18) E/flutter (26375): #21 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:680:45) E/flutter (26375): #22 Future._propagateToListeners (dart:async/future_impl.dart:709:32) E/flutter (26375): #23 Future._completeWithValue (dart:async/future_impl.dart:524:5) E/flutter (26375): #24 _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:32:15) E/flutter (26375): #25 _completeOnAsyncReturn (dart:async-patch/async_patch.dart:290:13) E/flutter (26375): #26 MethodChannelQuery.getDocuments (package:cloud_firestore_platform_interface/src/method_channel/method_channel_query.dart) E/flutter (26375): #27 _asyncThenWrapperHelper.<anonymous closure> (dart:async-patch/async_patch.dart:73:64) E/flutter (26375): #28 _rootRunUnary (dart:async/zone.dart:1134:38) E/flutter (26375): #29 _CustomZone.runUnary (dart:async/zone.dart:1031:19) E/flutter (26375): #30 _FutureListener.handleValue (dart:async/future_impl.dart:139:18) E/flutter (26375): #31 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:680:45) E/flutter (26375): #32 Future._propagateToListeners (dart:async/future_impl.dart:709:32) E/flutter (26375): #33 Future._completeWithValue (dart:async/future_impl.dart:524:5) E/flutter (26375): #34 _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:32:15) E/flutter (26375): #35 _completeOnAsyncReturn (dart:async-patch/async_patch.dart:290:13) E/flutter (26375): #36 MethodChannel.invokeMapMethod (package:flutter/src/services/platform_channel.dart) E/flutter (26375): #37 _asyncThenWrapperHelper.<anonymous closure> (dart:async-patch/async_patch.dart:73:64) E/flutter (26375): #38 _rootRunUnary (dart:async/zone.dart:1134:38) E/flutter (26375): #39 _CustomZone.runUnary (dart:async/zone.dart:1031:19) E/flutter (26375): #40 _FutureListener.handleValue (dart:async/future_impl.dart:139:18) E/flutter (26375): #41 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:680:45) E/flutter (26375): #42 Future._propagateToListeners (dart:async/future_impl.dart:709:32) E/flutter (26375): #43 Future._completeWithValue (dart:async/future_impl.dart:524:5) E/flutter (26375): #44 _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:32:15) E/flutter (26375): #45 _completeOnAsyncReturn (dart:async-patch/async_patch.dart:290:13) E/flutter (26375): #46 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart) E/flutter (26375): #47 _asyncThenWrapperHelper.<anonymous closure> (dart:async-patch/async_patch.dart:73:64) E/flutter (26375): #48 _rootRunUnary (dart:async/zone.dart:1134:38) E/flutter (26375): #49 _CustomZone.runUnary (dart:async/

一人で悩み続けたのですが全く解決せず、ご回答いただければとても嬉しいです!!
よろしくお願いします!!

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

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

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

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

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

hoshi-takanori

2020/04/06 20:43

Flutter よく分かりませんが、Error handler must accept one Object or one Object and a StackTrace as arguments, and return a a valid result というエラーなので、get list の最後の .catchError((Exception e) => print('userLikedList error:$e')); で何か値を返す必要があるような気がします。ちなみにこのエラーメッセージ (print してるやつ) は何か表示されてますか?
mu-------

2020/04/06 23:51

ありがとうございます! エラーメッセージについてですが、printしているやつは何も表示されていません…。 しかし、catch文の中のreturnで適当に値を返すと、エラー分の「and return a a valid result: Closure: (Exception) => Null」の箇所の「Null」のところの値が変わったので、エラー自体は適切な値が返っていないことによるものだと思いました! エラーがどこで表示されているかの原因はわかりました、ありがとうございます! ただ、エラーが発生する根本的な原因を見つけられたら嬉しいです(泣)
hoshi-takanori

2020/04/06 23:56

get list の戻り値は Future<List<Post>> なので、空のリストを返せばいいのでは。(Dart 知らないので、書き方は分かりません。)
guest

回答2

0

Exceptionに限定することはできないため、
この部分を

Dart

1.catchError((Exception e) {

こうする必要があります。

Dart

1.catchError((Object e) {

https://stackoverflow.com/questions/55268266/what-is-wrong-with-this-dart-error-handler

投稿2020/06/30 03:02

tepci

総合スコア419

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

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

0

解決していませんが、動作するようにはなりました!!

thenのあとのcatchErrorの文ごっそり削除すると、動作しました。

hoshi-takanoriさんがコメントしてくださいましたが、やはりcatchのreturnのところが悪さをしていたようです。
しかし、Future<List<Post>>の空の配列を返すようにしてもエラーが出力され、解決はしませんでした…。

dart

1// ここのリストを取ってきて表示させたい!! 2 Future<List<Post>> get list async { 3 return usersInfoCollection 4 .document(uid) 5 .collection('likedPosts') 6 .orderBy('createdAt', descending: true) 7 .limit(10) 8 .getDocuments() 9 .then(_userPostListFromSnapshot); 10 } 11 12 Future<List<Post>> _listFromSnapshot(QuerySnapshot collection) async { 13 final posts = <Post>[]; 14 try { 15 // ここのfor文が非同期処理でうまくいっていない?? 16 for (final document in collection.documents) { 17 final ref = db.document(document['postRef'].toString()); 18 await ref.get().then((docPost) { 19 final post = Post( 20 nickname: docPost['nickname'] as String ?? '', 21 createdAt: docPost['createdAt'] as Timestamp, 22 updatedAt: docPost['updatedAt'] as Timestamp, 23 postId: docPost.documentID, 24 ); 25 posts.add(post); 26 }); 27 } 28 } on Exception catch (e) { 29 print('futurelist error:$e'); 30 } 31 return posts; 32 }

投稿2020/04/08 03:59

mu-------

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問