下記のコードのようにRiverPodのFutureProvider
を使用しており、FireBaseのAuthenticationの結果を受け取り、navigator.dart
でその結果を利用したいと考えております。その利用結果が示す場所はhere3
なのですが、ここでなぜか必ずAsyncData<bool>(value: false)
でvalueとしてfalseを返してきてしまいます。
仮に下記のsample.dartにあるように、Future型を返すような関数であれば正しく動作してくれるのですが、FutureProvider
を利用すると同じように期待する動作をしてくれません。
原因及び解決方法について、アドバイスをいただけると大変ありがたいです。
よろしくお願い申し上げます。
Dart
1//auth.dart 2import 'package:firebase_auth/firebase_auth.dart'; 3import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 4import 'package:riverpod/riverpod.dart'; 5 6final authUser = FutureProvider<bool>((ref) async { //here1 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{ 29 ref.read(completeErrorMessage.notifier).update((state) => awesomeText(icon: FontAwesomeIcons.lightbulb, text: 'EZ10:予期しないエラーです、管理者へ問い合わせください',color: MyStyle.alertColor)); 30 } 31 return false; 32 } 33});
Dart
1//navigator.dart 2import 'dart:developer'; 3import 'dart:ui'; 4 5import 'package:cards/control/auth.dart'; 6import 'package:flutter/material.dart'; 7import 'package:flutter_riverpod/flutter_riverpod.dart'; 8 9class MyNavigator extends ConsumerWidget { 10 final Widget destinationTo; 11 final BuildContext context; 12 final String goBack; 13 final List<GlobalKey<FormState>>? formKeyList; 14 15 MyNavigator( 16 {required this.destinationTo, 17 required this.context, 18 required this.goBack, 19 this.formKeyList, 20 Key? key, 21 required}) 22 : super(key: key); 23 24 25 Widget build(BuildContext context, WidgetRef ref) { 26 final getResult = ref.watch(authUser);//here2 27 // TextButton myNavigator(BuildContext context) { 28 return TextButton( 29 style: TextButton.styleFrom( 30 foregroundColor: MyStyle.mainColor, 31 ), 32 onPressed: () { 33 switch (goBack) { 34 case "進む": 35 for (var i = 0; i < formKeyList!.length; i++) { 36 if (!(formKeyList![i].currentState!.validate())) { 37 return; 38 } 39 } 40 navigatorAnimation( 41 context: context, goBack: goBack, destinationTo: destinationTo); 42 break; 43 case "戻る": 44 navigatorAnimation( 45 context: context, goBack: goBack, destinationTo: destinationTo); 46 break; 47 case "確認メールを送信する": 48 print(getResult);//here3 49 // getResult.then( 50 // (value) { 51 // if (value == false) {//catchでエラー側にthrowされた場合falseをreturnして、さらにここではreturnで処理が終了 52 // return; 53 // } else if (value == true) {// try -catchでエラーが非発生 54 // navigatorAnimation( 55 // context: context, 56 // goBack: goBack, 57 // destinationTo: destinationTo); 58 // } 59 // }); 60 break; 61 } 62 }, 63 child: Text(goBack), 64 ); 65 } 66} 67 68void navigatorAnimation( 69 {required BuildContext context, 70 required String goBack, 71 required Widget destinationTo}) { 72 Offset? begin; 73 Navigator.of(context).push( 74 PageRouteBuilder( 75 pageBuilder: (context, animation, secondaryAnimation) { 76 return destinationTo; 77 }, 78 transitionDuration: const Duration(milliseconds: 300), 79 transitionsBuilder: (context, animation, secondaryAnimation, child) { 80 goBack == "進む" ? begin = const Offset(1.0, 0.0) : 0; 81 goBack == "戻る" ? begin = const Offset(-1.0, 0.0) : 0; 82 goBack == "確認メールを送信する" ? begin = const Offset(1.0, 0.0) : 0; 83 const Offset end = Offset.zero; 84 final Animatable<Offset> tween = Tween(begin: begin, end: end) 85 .chain(CurveTween(curve: Curves.easeInOut)); 86 final Animation<Offset> offsetAnimation = animation.drive(tween); 87 return SlideTransition( 88 position: offsetAnimation, 89 child: child, 90 ); 91 }, 92 ), 93 ); 94} 95
Dart
1//sample.dart 2Future<bool> authUser(ref) async { 3 try { 4 final FirebaseAuth auth = FirebaseAuth.instance; 5 final UserCredential _result = 6 await auth.createUserWithEmailAndPassword( 7 email: emailController.text, 8 password: maskController.text, 9 ); 10 User _user = _result.user!; // 登録したユーザー情報 11 _user.sendEmailVerification(); 12 return Future<bool>.value(true); 13 } on FirebaseAuthException catch (e) { 14 if (e.code == 'email-already-in-use') { 15 ref.read(completeErrorMessage.notifier).update((state) => awesomeText(icon: FontAwesomeIcons.lightbulb, text: 'EZ01:指定したメールアドレスは登録済みです',color: MyStyle.alertColor)); 16 } else if (e.code == 'invalid-email') { 17 ref.read(completeErrorMessage.notifier).update((state) => awesomeText(icon: FontAwesomeIcons.lightbulb, text: 'EZ02:メールアドレスのフォーマットが正しくありません',color: MyStyle.alertColor)); 18 } else if (e.code == 'operation-not-allowed') { 19 ref.read(completeErrorMessage.notifier).update((state) => awesomeText(icon: FontAwesomeIcons.lightbulb, text: 'EZ03:指定したメールアドレス・パスワードは現在使用できません',color: MyStyle.alertColor)); 20 } else if (e.code == 'weak-password') { 21 ref.read(completeErrorMessage.notifier).update((state) => awesomeText(icon: FontAwesomeIcons.lightbulb, text: 'EZ04:パスワードは6文字以上にしてください',color: MyStyle.alertColor)); 22 } else if (e.code == 'network-request-failed') { 23 ref.read(completeErrorMessage.notifier).update((state) => awesomeText(icon: FontAwesomeIcons.lightbulb, text: 'EZ05:通信環境を確認してください',color: MyStyle.alertColor)); 24 } else{ 25 ref.read(completeErrorMessage.notifier).update((state) => awesomeText(icon: FontAwesomeIcons.lightbulb, text: 'EZ10:予期しないエラーです、管理者へ問い合わせください',color: MyStyle.alertColor)); 26 } 27 return Future<bool>.value(false); 28 } 29}
回答1件
あなたの回答
tips
プレビュー