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

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

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

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

Dart

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

解決済

FutureProviderから返されたAsyncValueのloading中に表示したshowDialogを消すことができない

mako_0221
mako_0221

総合スコア82

Flutter

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

Dart

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

1回答

0リアクション

0クリップ

252閲覧

投稿2022/10/05 14:20

以下のようなコードで final authC = ref.watch(authFutureProvider);で得られたAsyncValueにおいてwhen()を利用してloading:中にダイアログボックスで'CircularProgressIndicator()'を表示したいと考えております。
ダイアログボックス自体は表示させることができたのですが、loadingの完了に伴い、この表示を消すことができません。そこで調べてみるとshowDialog()は自動的にloadingが完了しても消えないようで、data(data){Navigator.of(context).pop();} //hereを追加したのですが、なおloading完了後にshowDialog()の表示を消すことができません。

当該表示をloading後に消すための解決策についてアドバイスを願えますでしょうか?
よろしくお願い申し上げます。

Dart

import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:cards/view/register2.dart'; import 'package:cards/view/register4.dart'; import 'package:cards/main.dart'; import 'gender.dart'; import 'header.dart'; import 'navigate.dart'; import 'style.dart'; final authFutureProvider = FutureProvider<bool>( (ref) async => authUser(ref), ); class Register3Widget extends ConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { // Widget? loading; if (ref.watch(sendEmailPressProvider)) { final authC = ref.watch(authFutureProvider); authC.when( data: (data) {}, error: (error, stackTrace) {}, loading: () { final loading = WidgetsBinding.instance.addPostFrameCallback((_) { showDialog( context: context, builder: (context) { return const Center( child: CircularProgressIndicator(), ); } ); }); }, ); data(data){Navigator.of(context).pop();} //here } final alertMessage = ref.watch(completeErrorMessage); return Scaffold( body: Padding( padding: const EdgeInsetsDirectional.fromSTEB(20, 75, 20, 0), child: Column( children: [ Container( width: double.infinity, height: 50, alignment: Alignment.topLeft, child: Image.asset('images/logo.png'), ), Container( padding: const EdgeInsetsDirectional.fromSTEB(10, 0, 10, 0), margin: const EdgeInsets.only(top: 30), width: double.infinity, child: Column( children: [ myHeader("性別に関する情報を選択してください"), Align( child: GenderSelect(), ), // awesomeText(icon: FontAwesomeIcons.lightbulb, text: "これらの登録情報を後で修正できます",color: MyStyle.letterColor), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Align( alignment: Alignment.topRight, child: MyNavigator( destinationTo: Register2Widget(), context: context, goBack: "戻る", ), ), Align( child: MyNavigator( destinationTo: Register4Widget(), context: context, goBack: "確認メールを送信する"), ), ]), Container( alignment: Alignment.centerLeft, child: alertMessage, ), ], ), ), ], ), )); } }

Dart

import 'package:firebase_auth/firebase_auth.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import '../main.dart'; import '../view/style.dart'; Future<bool> authUser(ref) async { try { final FirebaseAuth auth = FirebaseAuth.instance; final UserCredential _result = await auth.createUserWithEmailAndPassword( email: emailController.text, password: maskController.text, ); User _user = _result.user!; // 登録したユーザー情報 _user.sendEmailVerification(); return true; } on FirebaseAuthException catch (e) { if (e.code == 'email-already-in-use') { ref.read(completeErrorMessage.notifier).update((state) => awesomeText(icon: FontAwesomeIcons.lightbulb, text: 'EZ01:指定したメールアドレスは登録済みです',color: MyStyle.alertColor)); } else if (e.code == 'invalid-email') { ref.read(completeErrorMessage.notifier).update((state) => awesomeText(icon: FontAwesomeIcons.lightbulb, text: 'EZ02:メールアドレスのフォーマットが正しくありません',color: MyStyle.alertColor)); } else if (e.code == 'operation-not-allowed') { ref.read(completeErrorMessage.notifier).update((state) => awesomeText(icon: FontAwesomeIcons.lightbulb, text: 'EZ03:指定したメールアドレス・パスワードは現在使用できません',color: MyStyle.alertColor)); } else if (e.code == 'weak-password') { ref.read(completeErrorMessage.notifier).update((state) => awesomeText(icon: FontAwesomeIcons.lightbulb, text: 'EZ04:パスワードは6文字以上にしてください',color: MyStyle.alertColor)); } else if (e.code == 'network-request-failed') { ref.read(completeErrorMessage.notifier).update((state) => awesomeText(icon: FontAwesomeIcons.lightbulb, text: 'EZ05:通信環境を確認してください',color: MyStyle.alertColor)); } else if (e.code == 'too-many-requests') { ref.read(completeErrorMessage.notifier).update((state) => awesomeText(icon: FontAwesomeIcons.lightbulb, text: 'EZ06:確認メール送信済みの可能性があります、迷惑メールフォルダ等を確認してください',color: MyStyle.alertColor)); }else{ ref.read(completeErrorMessage.notifier).update((state) => awesomeText(icon: FontAwesomeIcons.lightbulb, text: 'EZ10:予期しないエラーです、管理者へ問い合わせください',color: MyStyle.alertColor)); } return false; } }

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

Flutter

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

Dart

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