🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Firebase

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

Flutter

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

Q&A

解決済

1回答

1961閲覧

Flutter - FirebaseAuthで発生する。エラーをtry catchで拾えない。

atk_721

総合スコア62

Firebase

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

Flutter

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

0グッド

0クリップ

投稿2021/03/17 18:50

編集2021/03/19 13:02

前提・実現したいこと

FirebaseAuthのsignInWithCredential及びcreateUserWithEmailAndPasswordを使ってEmailでアカウント登録、ログインをさせたいのですが、入力形式が間違っていた場合、email_sign_in_form.dart内でtry catchでエラーを拾ってログに出力したい。

発生している問題・エラーメッセージ

デバックコンソールにエラーを表示させたいが、入力形式が違う場合アプリが落ちてしまう。

PlatformException (PlatformException(invalid-email, The email address is badly formatted., {code: invalid-email, message: The email address is badly formatted., nativeErrorMessage: The email address is badly formatted., nativeErrorCode: 17008, additionalData: {}}, null))

イメージ説明

###Packageのバージョン

version: 1.0.0+1 environment: sdk: ">=2.10.0 <3.0.0" dependencies: flutter: sdk: flutter cupertino_icons: ^1.0.0 firebase_auth: ^0.20.1 firebase_core: ^0.7.0

Auth.dart

import 'package:firebase_auth/firebase_auth.dart'; abstract class AuthBase { User get currentUser; Future<User> signInAnonymous(); Future<void> signOut(); Stream<User> authStateChanges(); Future<User> signInWithEmailAndPassword(String email, String password); Future<User> createUserWithEmailAndPassword(String email, String password); } class Auth implements AuthBase { final _auth = FirebaseAuth.instance; Stream<User> authStateChanges() => _auth.authStateChanges(); @override User get currentUser => _auth.currentUser; @override Future<User> signInAnonymous() async { final userCredentials = await _auth.signInAnonymously(); return userCredentials.user; } @override Future<User> signInWithEmailAndPassword(String email, String password) async { final userCredential = await _auth.signInWithCredential( EmailAuthProvider.credential(email: email, password: password), ); return userCredential.user; } @override Future<User> createUserWithEmailAndPassword( String email, String password) async { final userCredential = await _auth.createUserWithEmailAndPassword( email: email, password: password); return userCredential.user; } @override Future<void> signOut() async { await _auth.signOut(); } }

###email_sign_in_form.dart

import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_firebase/conponets_widgets/form_submit_button.dart'; import 'package:flutter_firebase/service/auth.dart'; import 'package:flutter_firebase/sign_page/validators.dart'; enum EmamilSignInFormType { signIn, register, } class EmailSignInForm extends StatefulWidget with EmailAndPasswordValidators { EmailSignInForm({Key key, @required this.auth}) : super(key: key); final AuthBase auth; @override _EmailSignInFormState createState() => _EmailSignInFormState(); } class _EmailSignInFormState extends State<EmailSignInForm> { // - Properties final _emailController = TextEditingController(); final _passwordController = TextEditingController(); final _emailFocusNode = FocusNode(); final _passwordFocusNode = FocusNode(); EmamilSignInFormType _formType = EmamilSignInFormType.signIn; String get _email => _emailController.text; String get _password => _passwordController.text; bool _submitted = false; // - Functions void _toggleFormType() { setState(() { _submitted = false; _formType = _formType == EmamilSignInFormType.signIn ? EmamilSignInFormType.register : EmamilSignInFormType.signIn; }); _emailController.clear(); _passwordController.clear(); } ************************************************* ***ここで⇩例外が発生した場合コンソールにエラーを表示したい。** ************************************************* void _submit() async { setState(() { _submitted = true; }); try { if (_formType == EmamilSignInFormType.signIn) { await widget.auth.signInWithEmailAndPassword(_email, _password); } else { await widget.auth.createUserWithEmailAndPassword(_email, _password); } Navigator.pop(context); } on PlatformException catch (e) { print(e.toString()); } catch (e) { print(e.toString()); } } void _emailEditingCompleted() { FocusScope.of(context).requestFocus(_passwordFocusNode); } void _updateState() { setState(() { print(_email); print(_password); }); } List<Widget> _buildChildren() { final primaryText = _formType == EmamilSignInFormType.signIn ? 'Sign in' : 'Create an account'; final secondaryText = _formType == EmamilSignInFormType.signIn ? 'Need an account? Register' : 'Have an account? Sign in'; bool submitEnabled = widget.emailValidator.isValid(_email) && widget.passwordValidator.isValid(_password); return [ _buildEmailTextField(), SizedBox( height: 8.0, ), _buildPasswordTextField(), SizedBox( height: 32.0, ), FormSubmitButton( text: primaryText, onPressed: submitEnabled ? _submit : null, ), TextButton( onPressed: _toggleFormType, child: Text(secondaryText), ), ]; } TextField _buildPasswordTextField() { final showErrorText = _submitted && widget.passwordValidator.isValid(_password); return TextField( focusNode: _passwordFocusNode, keyboardType: TextInputType.visiblePassword, controller: _passwordController, obscureText: true, decoration: InputDecoration( labelText: 'Password', errorText: showErrorText ? widget.invalidPasswordErrorText : null, ), textInputAction: TextInputAction.done, onEditingComplete: _submit, onChanged: (password) => _updateState(), ); } TextField _buildEmailTextField() { bool showErrorText = _submitted && widget.emailValidator.isValid(_email); return TextField( focusNode: _emailFocusNode, keyboardType: TextInputType.emailAddress, controller: _emailController, autocorrect: false, decoration: InputDecoration( labelText: 'Email', hintText: 'sample@email.com', errorText: showErrorText ? widget.invalidEmailErrorText : null, ), textInputAction: TextInputAction.next, onEditingComplete: _emailEditingCompleted, onChanged: (email) => _updateState(), ); } @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, mainAxisSize: MainAxisSize.min, children: _buildChildren(), ), ); } }

###email_sign_in_page.dart

import 'package:flutter/material.dart'; import 'package:flutter_firebase/service/auth.dart'; import 'package:flutter_firebase/sign_page/email_sign_in_form.dart'; class EmailSignInPage extends StatelessWidget { EmailSignInPage({this.auth}); final AuthBase auth; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Sign in'), ), body: SafeArea( child: SingleChildScrollView( child: Container( padding: const EdgeInsets.all(16.0), child: Card( elevation: 5.0, child: EmailSignInForm( auth: auth, ), ), ), ), ), backgroundColor: Colors.grey[200], ); } }

補足情報(FW/ツールのバージョンなど)

イメージ説明

###追記
FirebaseのログインプロバイダーEmail/passwordは有効です。
StackOverFlowに似た質問がありますが、これはPackageのバグなのでしょうか?
[firebase_auth] Unhandled Exception: PlatformException(ERROR_INVALID_VERIFICATION_CODE)

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

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

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

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

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

guest

回答1

0

自己解決

VisualStudiCodeでBuildする際に、ブレークポイントのUncaught Exceptionsのチェックをはずす事でエラーをキャッチしてくれました。

投稿2021/03/22 00:39

atk_721

総合スコア62

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問