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

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

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

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

Flutter

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

Firebase Authentication

Firebase Authenticationは、Firebaseを利用したユーザーの認証機能です。バックエンドサービス、SDK、アプリでのユーザー認証に使用できるUIライブラリが用意されています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Dart

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

Q&A

0回答

846閲覧

Firebase Authenticationでログアウト時に再ログインできなくなる

退会済みユーザー

退会済みユーザー

総合スコア0

Firebase

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

Flutter

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

Firebase Authentication

Firebase Authenticationは、Firebaseを利用したユーザーの認証機能です。バックエンドサービス、SDK、アプリでのユーザー認証に使用できるUIライブラリが用意されています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Dart

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

0グッド

0クリップ

投稿2020/04/08 04:24

編集2022/01/12 10:55

FlutterでFirebaseを使ってID、PWによるログイン処理を実装しています。
そこで、ログインはうまくいくのですが、ログアウトしてログインページに戻ったあとに再ログインできないという事象に悩まされています。
具体的には認証情報を入力してLoginボタンを押してもhomepage.dartに画面遷移しません。

基本的には、こちらを参考に実装しています。

エラーです。

I/flutter (10611): Error: NoSuchMethodError: The method 'signIn' was called on null. I/flutter (10611): Receiver: null I/flutter (10611): Tried calling: signIn("IDが表示されている", "<PWが表示されている>") E/flutter (10611): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: NoSuchMethodError: Class 'NoSuchMethodError' has no instance getter 'message'. E/flutter (10611): Receiver: Instance of 'NoSuchMethodError' E/flutter (10611): Tried calling: message E/flutter (10611): #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5) E/flutter (10611): #1 _LoginSignupPageState.validateAndSubmit.<anonymous closure> (package:flutter_app/login_signup_page.dart:78:29) E/flutter (10611): #2 State.setState (package:flutter/src/widgets/framework.dart:1148:30) E/flutter (10611): #3 _LoginSignupPageState.validateAndSubmit (package:flutter_app/login_signup_page.dart:76:9) E/flutter (10611): #4 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:706:14) E/flutter (10611): #5 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:789:36) E/flutter (10611): #6 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24) E/flutter (10611): #7 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:486:11) E/flutter (10611): #8 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:264:5) E/flutter (10611): #9 BaseTapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:236:7) E/flutter (10611): #10 GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:156:27) E/flutter (10611): #11 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:222:20) E/flutter (10611): #12 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:198:22) E/flutter (10611): #13 GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:156:7) E/flutter (10611): #14 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:102:7) E/flutter (10611): #15 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:86:7) E/flutter (10611): #16 _rootRunUnary (dart:async/zone.dart:1138:13) E/flutter (10611): #17 _CustomZone.runUnary (dart:async/zone.dart:1031:19) E/flutter (10611): #18 _CustomZone.runUnaryGuarded (dart:async/zone.dart:933:7) E/flutter (10611): #19 _invoke1 (dart:ui/hooks.dart:273:10) E/flutter (10611): #20 _dispatchPointerDataPacket (dart:ui/hooks.dart:182:5)

ソースです。★をつけた箇所がデバッグした結果、怪しいと感じた箇所です。

main.dart

void main() { // 省略 } class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( // 省略, home: RootPage(auth: Auth())); } }

root_page.dart

class RootPage extends StatefulWidget { RootPage({this.auth});  //★authインスタンスは重複していないか final BaseAuth auth; State<StatefulWidget> createState() => _RootPageState(); } class _RootPageState extends State<RootPage> { AuthStatus authStatus = AuthStatus.NOT_DETERMINED; String _userId = ""; void initState() { super.initState(); widget.auth.getCurrentUser().then((user) { setState(() { if (user != null) { _userId = user?.uid; } authStatus = user?.uid == null ? AuthStatus.NOT_LOGGED_IN : AuthStatus.LOGGED_IN; }); }); } void loginCallback() {   // 省略 }  //★本処理は適切に呼ばれているか void logoutCallback() { setState(() { authStatus = AuthStatus.NOT_LOGGED_IN; _userId = ""; }); } Widget buildWaitingScreen() { return Scaffold( // 省略 ); } Widget build(BuildContext context) { switch (authStatus) { case AuthStatus.NOT_DETERMINED: return buildWaitingScreen(); break; case AuthStatus.NOT_LOGGED_IN: return LoginSignupPage( auth: widget.auth, loginCallback: loginCallback, ); break; case AuthStatus.LOGGED_IN: if (_userId.length > 0 && _userId != null) { return HomePage( userId: _userId, auth: widget.auth, logoutCallback: logoutCallback, ); } else return buildWaitingScreen(); break; default: return buildWaitingScreen(); } } }

login_signup_page.dart

class LoginSignupPage extends StatefulWidget { LoginSignupPage({this.auth, this.loginCallback}); final BaseAuth auth; final VoidCallback loginCallback; State<StatefulWidget> createState() => _LoginSignupPageState(); } class _LoginSignupPageState extends State<LoginSignupPage> { final _formKey = GlobalKey<FormState>(); String _groupId; String _displayName; String _email; String _password; String _errorMessage; bool _isLoginForm; bool _isLoading; bool validateAndSave() { final form = _formKey.currentState; if (form.validate()) { form.save(); return true; } return false; } void validateAndSubmit() async { setState(() { _errorMessage = ""; _isLoading = true; }); if (validateAndSave()) { String userId = ""; try { if (_isLoginForm) {      //★このtry文でエラーが発生しているように見える userId = await widget.auth.signIn(_email, _password); } else { userId = await widget.auth.signUp(_email, _password); Firestore.instance.collection('users').document(userId).setData({ // 省略 }); widget.auth.sendEmailVerification(); _showVerifyEmailSentDialog(); } setState(() { _isLoading = false; }); if (userId.length > 0 && userId != null && _isLoginForm) { widget.loginCallback(); } } catch (e) { //★ここでeがnullになっていることが原因? setState(() { _isLoading = false; _errorMessage = e.message; _formKey.currentState.reset(); }); } } } @override void initState() { _errorMessage = ""; _isLoading = false; _isLoginForm = true; super.initState(); } void resetForm() { // 省略 } void toggleFormMode() { // 省略 } Widget build(BuildContext context) { return Scaffold( // 省略 ); } // 省略 }

homepage.dart

class HomePage extends StatelessWidget { HomePage( {Key key, this.auth, this.onSignedOut, this.userId, this.logoutCallback}) : super(key: key); final BaseAuth auth; final VoidCallback onSignedOut; final VoidCallback logoutCallback; final String userId; Widget build(BuildContext context) { //★TODO: 認証情報等をすべて引数で下位Widgetに渡している箇所はProviderでリファクタリングする return MaterialApp( home: MyHomePage( title: 'title', auth: this.auth, onSignedOut: this.onSignedOut, logoutCallback: this.logoutCallback, userId: this.userId), routes: <String, WidgetBuilder>{ '/login_signup': (BuildContext context) => LoginSignupPage(), }); } } class MyHomePage extends StatefulWidget { MyHomePage( {Key key, this.title, this.auth, this.onSignedOut, this.logoutCallback, this.userId}) : super(key: key); final String title; final BaseAuth auth; final VoidCallback logoutCallback; final String userId; final VoidCallback onSignedOut; _MyHomePageState createState() => _MyHomePageState( auth: this.auth, onSignedOut: this.onSignedOut, userId: this.userId); } class _MyHomePageState extends State<MyHomePage> { FirebaseUser user; final BaseAuth auth; final logoutCallback; final VoidCallback onSignedOut; _MyHomePageState( {this.auth, this.onSignedOut, this.logoutCallback, this.userId}); void initState() { super.initState(); initUser() async { setState(() {}); } final String userId; String displayName = '名無し'; Widget build(BuildContext context) { Firestore.instance .collection('users') .document(userId) .get() .then((onValue) { displayName = onValue.data['displayName'].toString(); }); return Scaffold( appBar: Header(), body: Column( children: <Widget>[ Expanded( flex: 0, child: Row( children: <Widget>[ // 省略 Expanded( flex: 1, child: FlatButton( // 省略 onPressed: () async { try { //★logoutCallbackが呼べていない? await widget.auth.signOut(); widget.logoutCallback; } catch (e) { } //★ここも怪しい Navigator.of(context) .pushReplacementNamed('/login_signup'); }, ), ) ], ), ), // 省略 ], ), ); } }

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問