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

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

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

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

Flutter

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

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

解決済

Flutter firestore 同期、非同期処理について

rn383
rn383

総合スコア2

Firebase

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

Flutter

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

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

1回答

0評価

0クリップ

378閲覧

投稿2022/06/09 03:00

編集2022/06/09 19:12

Flutterの同期、非同期処理についてご教示いただきたく存じます。

firestoreよりデータを取得し、取得した値をaという変数に格納。
その後、if文にてaの変数の値によって処理を行うプログラムです。
Widgetの中に記載しております。

現状、[1]のget()まで処理が行われ、[2]のelse、最後に[3]のthenの中を処理しています。
本当であれば、[1]→[3]→[2]の順でif文の処理が行われるようにしたいです。
async、awaitを入れれば非同期処理を同期処理にできると思っていたのですが。。。。
何が原因でしょうか?同期、非同期について理解できていないためご教示いただけますと幸いです。

class Home extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.start, children: <Widget>[ Row(mainAxisAlignment: MainAxisAlignment.start, children: <Widget>[ Container( child: Text('メニュー')), ]), Container( child: _buildChild(context), ), ], ), ), ); } Widget _buildChild(BuildContext context) { String uid = FirebaseAuth.instance.currentUser!.uid; String a = ""; Future<void> future1() async { await FirebaseFirestore.instance .collection('users') .doc(uid) .get() //[1] .then((DocumentSnapshot document) async { Map<String, dynamic> data = await document.data()! as Map<String, dynamic>; //[3] a = await data['username'];   //data['username']には"aaa"が入ります }); } future1(); if (a == "aaa") { return Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Container( margin: EdgeInsets.only(top: 100), alignment: Alignment.center, child: Text('はじめまして')), ]); } return Padding( //[2] padding: EdgeInsetsDirectional.fromSTEB(0, 20, 0, 0), child: Row( mainAxisSize: MainAxisSize.max, children: [ Padding( padding: EdgeInsetsDirectional.fromSTEB(15, 0, 0, 0), child: Container( width: 280, height: 100, child: Column( mainAxisSize: MainAxisSize.max, children: [ Container( width: 280, height: 30, child: Padding( padding: EdgeInsetsDirectional.fromSTEB(0, 4, 0, 0), child: Text( 'こんにちは', textAlign: TextAlign.center, ), ), ), ], ), ), ), ], ), ); } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

rn383

2022/06/09 09:04

class Home extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.start, children: <Widget>[ Row(mainAxisAlignment: MainAxisAlignment.start, children: <Widget>[ Container( child: Text('メニュー')), ]), Container( child: _buildChild(context), ), ], ), ), ); } Widget _buildChild(BuildContext context) { String uid = FirebaseAuth.instance.currentUser!.uid; String a = ""; Future<void> future1() async { await FirebaseFirestore.instance .collection('users') .doc(uid) .get() .then((DocumentSnapshot document) async { Map<String, dynamic> data = await document.data()! as Map<String, dynamic>; a = await data['username']; }); } future1(); if (a == "aaa") { return Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Container( margin: EdgeInsets.only(top: 100), alignment: Alignment.center, child: Text('はじめまして')), ]); } return Padding( padding: EdgeInsetsDirectional.fromSTEB(0, 20, 0, 0), child: Row( mainAxisSize: MainAxisSize.max, children: [ Padding( padding: EdgeInsetsDirectional.fromSTEB(15, 0, 0, 0), child: Container( width: 280, height: 100, child: Column( mainAxisSize: MainAxisSize.max, children: [ Container( width: 280, height: 30, child: Padding( padding: EdgeInsetsDirectional.fromSTEB(0, 4, 0, 0), child: Text( 'こんにちは', textAlign: TextAlign.center, ), ), ), ], ), ), ), ], ), ); } }
ta.fu

2022/06/09 09:16

コードは、元の質問側に追記もしくは修正するようにしてください。 こちら側にコードを入れられても、フォーマットされないので見づらいためです。
rn383

2022/06/09 09:30

失礼しました。 元のコードを修正しました。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Firebase

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

Flutter

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

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。