以下のようなコードで 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}

回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2022/10/06 04:46
2022/10/07 08:08