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

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

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

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

React Native

React Nativeは、ネイティブモバイルアプリ(iOS/Android)を作成できるJavaScriptフレームワークです。Reactと同じ設計のため、宣言的なコンポーネントでリッチなUIを開発することが可能です。

Cloud Firestore

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

4回答

1030閲覧

FireStoreデータの読み込みはできるが想定された値がセットされない

nakapon9517

総合スコア3

Firebase

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

React Native

React Nativeは、ネイティブモバイルアプリ(iOS/Android)を作成できるJavaScriptフレームワークです。Reactと同じ設計のため、宣言的なコンポーネントでリッチなUIを開発することが可能です。

Cloud Firestore

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

1クリップ

投稿2020/08/30 12:32

前提・実現したいこと

現在、ReactNativeでスマホアプリを開発しています。

CloudFirestoreに保存してある画像パスを取得し、
Storage内の画像を表示させたいと考えています。

説明下手なところもありご不便おかけいたしますが、
有識者の方のご回答いただけると助かります。

発生している問題・エラーメッセージ

対象の画面を開いたところ以下の順でログが出力されており
想定される画像が表示できなくて困っています。

Array [] --1 Array [ "https://firebasestorage.googleapis.com/v0/b/...", "https://firebasestorage.googleapis.com/v0/b/...", "https://firebasestorage.googleapis.com/v0/b/...", "https://firebasestorage.googleapis.com/v0/b/...", ]

該当のソースコード

export default function Battle({ navigation }: any) { let karutas: any[] = []; /** Get Path */ async function getKarutasUrl() { await getKarutaInfo() .then((param) => { karutas = param.filter((val) => val); console.log(karutas); // 上記ログの空でないArray取得 -> 値取得OK }) .catch(({ err }: any) => console.log(err)); } getKarutasUrl(); console.log(karutas); // 上記ログの空Array取得 -> 値取得NG ・ ・ ・
export async function getKarutaInfo() { let result: string[] = []; await fireStore .collection("image_karutas") .get() .then((snapShot) => { snapShot.forEach((doc) => { const karuta = doc.data(); result.push(karuta.path); // console.log(result); }); }) .catch((error) => { console.log("Error:" + error); }); // console.log(result); return result; }

現状

Arrayへの設定をforEachとしてkarutas.push()にしたり、
FireStore内のデータ構造を変更したり、
JSの処理順序を色々変えたりしたのですが上手くいかず。。

補足情報(FW/ツールのバージョンなど)

  • Node v12.18.3
  • npm 6.14.6
  • ReactNative sdk-38.0.2
  • TypeScript 3.9.5
  • Expo 3.24.0

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

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

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

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

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

guest

回答4

0

console.log前のgetKarutasUrlawaitしていないためconsole.log実行時にはまだkarutasが空なのではないでしょうか?

javascript

1export default function Battle({ navigation }: any) { 2 let karutas: any[] = []; 3 4/** Get Path */ 5 async function getKarutasUrl() { 6 await getKarutaInfo() 7 .then((param) => { 8 karutas = param.filter((val) => val); 9 console.log(karutas); // 上記ログの空でないArray取得 -> 値取得OK 10 }) 11 .catch(({ err }: any) => console.log(err)); 12 } 13 //getKarutasUrl(); 14 await getKarutasUrl(); // getKarutasUrl()の終了を待つ 15 console.log(karutas); // 上記ログの空Array取得 -> 値取得NG 161718

投稿2020/08/30 13:11

nekoniki

総合スコア2411

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

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

nakapon9517

2020/08/30 14:31

お疲れ様です。 ご回答いただきありがとうございます! ご指摘いただいた通り修正し確認したところ、 以下エラーが発生してしまうという状況です。。。 Error: Objects are not valid as a React child (found: object with keys {_40, _65, _55, _72}). if you... Reactの構文ミスでPromiseの処理を正しく行えていないのが原因とは思っているのですが、どこを修正したらいいのか分からずで詰まってしまっています。。。
nekoniki

2020/08/30 23:27

そのエラーはrender内で定義している変数にObject型が入ってきている場合のエラーだと思います。 質問文中にはrenderの記載が省略されていたので、いったんお手元のソースでrenderの箇所(おそらくgetKarutasUrlから返ってきた値を使っている箇所です)の書き方を見直すことをお勧めします。
guest

0

getKarutasUrl()が asyncで定義されているため、呼び出し時の処理が非同期で行われおり、
直後のconsole.log()が先に実行されているように読めました。

後続処理がgetKarutaUrl()の完了を前提としているのなら、
最初からgetKarutaInfo()のPromiseのチェーンとして実装すれば良いかなと思います。

javascript

1export default function Battle({ navigation }: any) { 2 async function getKarutasUrl() { 3 await getKarutaInfo() 4 .then((param) => { 5 karutas = param.filter((val) => val); 6 console.log(karutas); // 上記ログの空でないArray取得 -> 値取得OK 7 return karutas; 8 }) 9 .then((karutas) => { 10 console.log(karutas); 11 // もとのコードで getKarutasUrl() 以降にやりたい処理 12 }) 13 .catch(({ err }: any) => console.log(err)); 14 } 15 getKarutasUrl();

投稿2020/08/30 13:05

attakei

総合スコア2740

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

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

nakapon9517

2020/08/30 14:30

お疲れ様です。 ご回答いただきありがとうございます! ご指摘いただいた通り修正し確認したところ、 async function getKarutasUrl()の呼び出しが最初に呼ばれているため、 当初の空配列のままとなってしまいます。 export default function Battleを export default async function Battleとし、 getkarutasUrl()にawaitを付ける方法も試してみたのですが、 以下エラーが発生してしまうという状況です。。。 Error: Objects are not valid as a React child (found: object with keys {_40, _65, _55, _72}). if you...
guest

0

以下で解決できました。
async await Promise Reactについての理解不足です・・・

export default function Battle({ navigation }: any) { const [karutaDataList, setKarutaDataList] = useState([""]); useEffect(() => { // 画面初期描画の時のみ処理実行 getKarutaInfo() .then((res: string[]) => { console.log(res); setKarutaDataList(res); }) .catch(({ err }: any) => console.log(err)); }, []); return ( <SafeAreaView style={styles.container}> <ImageBackground source={tatami} style={styles.image}> <View style={styles.boiceBox}> <Text style={styles.text_size}>金色のガッシュベル好きだった</Text> </View> <View style={styles.box_top}> { // 空の文字列はFilterで除去 karutaDataList .filter((val) => val) .map((val) => { return ( <TouchableOpacity key={val}> <Image source={{ uri: val, }} style={styles.image_karuta} ></Image> </TouchableOpacity> ); }) } </View> </ImageBackground> </SafeAreaView> ); }

投稿2020/09/02 08:15

nakapon9517

総合スコア3

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

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

0

自己解決

以下コードで動作確認できました。
async,await,Promise,React構文の理解が足りませんでした。

export default function Battle({ navigation }: any) { const [karutaDataList, setKarutaDataList] = useState([""]); useEffect(() => { // 画面初期描画の時のみ処理実行 getKarutaInfo() .then((res: string[]) => { console.log(res); setKarutaDataList(res); }) .catch(({ err }: any) => console.log(err)); }, []); return ( <SafeAreaView style={styles.container}> <ImageBackground source={tatami} style={styles.image}> <View style={styles.boiceBox}> <Text style={styles.text_size}>金色のガッシュベル好きだった</Text> </View> <View style={styles.box_top}> { // 空の文字列はFilterで除去 karutaDataList .filter((val) => val) .map((val) => { return ( <TouchableOpacity key={val}> <Image source={{ uri: val, }} style={styles.image_karuta} ></Image> </TouchableOpacity> ); }) } </View> </ImageBackground> </SafeAreaView> ); }

投稿2020/09/02 07:59

nakapon9517

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問