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

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

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

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

Dart

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

Q&A

解決済

1回答

1165閲覧

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

mako_0221

総合スコア87

Flutter

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

Dart

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

0グッド

0クリップ

投稿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

1import 'package:flutter/material.dart'; 2import 'package:flutter_riverpod/flutter_riverpod.dart'; 3import 'package:cards/view/register2.dart'; 4import 'package:cards/view/register4.dart'; 5import 'package:cards/main.dart'; 6import 'gender.dart'; 7import 'header.dart'; 8import 'navigate.dart'; 9import 'style.dart'; 10 11final authFutureProvider = FutureProvider<bool>( 12 (ref) async => authUser(ref), 13); 14 15class Register3Widget extends ConsumerWidget { 16 17 Widget build(BuildContext context, WidgetRef ref) { 18 // Widget? loading; 19 if (ref.watch(sendEmailPressProvider)) { 20 final authC = ref.watch(authFutureProvider); 21 authC.when( 22 data: (data) {}, 23 error: (error, stackTrace) {}, 24 loading: () { 25 final loading = 26 WidgetsBinding.instance.addPostFrameCallback((_) { 27 showDialog( 28 context: context, 29 builder: (context) { 30 return const Center( 31 child: CircularProgressIndicator(), 32 ); 33 } 34 ); 35 }); 36 }, 37 ); 38 data(data){Navigator.of(context).pop();} //here 39 } 40 final alertMessage = ref.watch(completeErrorMessage); 41 return Scaffold( 42 body: Padding( 43 padding: const EdgeInsetsDirectional.fromSTEB(20, 75, 20, 0), 44 child: Column( 45 children: [ 46 Container( 47 width: double.infinity, 48 height: 50, 49 alignment: Alignment.topLeft, 50 child: Image.asset('images/logo.png'), 51 ), 52 Container( 53 padding: const EdgeInsetsDirectional.fromSTEB(10, 0, 10, 0), 54 margin: const EdgeInsets.only(top: 30), 55 width: double.infinity, 56 child: Column( 57 children: [ 58 myHeader("性別に関する情報を選択してください"), 59 Align( 60 child: GenderSelect(), 61 ), 62 // awesomeText(icon: FontAwesomeIcons.lightbulb, text: "これらの登録情報を後で修正できます",color: MyStyle.letterColor), 63 Row( 64 mainAxisAlignment: MainAxisAlignment.spaceBetween, 65 children: [ 66 Align( 67 alignment: Alignment.topRight, 68 child: MyNavigator( 69 destinationTo: Register2Widget(), 70 context: context, 71 goBack: "戻る", 72 ), 73 ), 74 Align( 75 child: MyNavigator( 76 destinationTo: Register4Widget(), 77 context: context, 78 goBack: "確認メールを送信する"), 79 ), 80 ]), 81 Container( 82 alignment: Alignment.centerLeft, 83 child: alertMessage, 84 ), 85 ], 86 ), 87 ), 88 ], 89 ), 90 )); 91 92 } 93 94} 95

Dart

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

実行できないのであくまで想像だけど、popを入れる場所はデータが確定するdataの場所じゃないかな。
そもそも、元の実装は構文エラーが出てないですか?

dart

1 authC.when( 2 data: (data) {Navigator.of(context).pop();}, // こっちに入れる 3 error: (error, stackTrace) {}, 4 loading: () { 5 final loading = 6 WidgetsBinding.instance.addPostFrameCallback((_) { 7 showDialog( 8 context: context, 9 builder: (context) { 10 return const Center( 11 child: CircularProgressIndicator(), 12 ); 13 } 14 ); 15 }); 16 }, 17 );

投稿2022/10/06 02:40

ta.fu

総合スコア1667

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

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

mako_0221

2022/10/06 04:46

コメントありがとうございます。すぐに試すことができる環境にいないため、とり急ぎコメントへの御礼をさせていただきます。なお、構文エラー自体は発生していないです。確かに自分のオリジナルのコードでの`data(data){Navigator.of(context).pop();}`はこのdata引数はどことからとって、実行しているのだろう、ととても不思議に思ってはいたのですが、実行だけはできてしまっています。 また、結果を記載させていただきます。
mako_0221

2022/10/07 08:08

すみません、一発解決でした。よく考えればその通りだよなと思いました。 お力添えありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問