Не удается войти снова при выходе с Firebase Authentication - PullRequest
0 голосов
/ 03 мая 2020

Я выполняю процесс входа в систему с ID и PW, используя Firebase с Flutter. Поэтому, хотя вход в систему работает нормально, меня раздражает тот факт, что я не могу войти в систему, а затем вернуться на страницу входа в систему, прежде чем я смогу войти снова. (Короче говоря, после выхода из системы невозможно снова войти в систему ...) В частности, даже если вы введете информацию для аутентификации и нажмете кнопку входа в систему, экран не будет go к 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)

Код ниже. В результате отладки, часть, помеченная знаком ★, оказалась подозрительной. Пожалуйста, научите меня, если вы обнаружите какие-либо ошибки и подозрительные коды. Особая благодарность!

void main() {
  // 省略
}

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

 //The auth instance unique?
  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() {
  // 省略
  }

 //★Is this process properly called?
  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();
    }
  }
}
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) {
     //★It looks this try statement is causing an error
          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) {
        //★Is it because e is null here?
        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(
        // 省略
        );
  }

 // 省略
}
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) {
    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 {
                        //★Can't call logoutCallback?
                        await widget.auth.signOut();
                        widget.logoutCallback;
                      } catch (e) {
                      }
                      //★Suspicious
                      Navigator.of(context)
                          .pushReplacementNamed('/login_signup');
                    },
                  ),
                )
              ],
            ),
          ),
              // 省略
        ],
      ),
    );
  }
}


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...