코딩하는 제리

[Flutter/Project](Instagram Clone) 회원가입, 로그인 에러 핸들링 및 스낵바 출력 본문

Flutter/Project_InstaClone(완)

[Flutter/Project](Instagram Clone) 회원가입, 로그인 에러 핸들링 및 스낵바 출력

JerryCho 2021. 2. 8. 11:35


trim() : 사용자가 입력한 공백을 인식하지 않음.

firebase_auth_state.dart -> 에러 내용 프린트
이미 존재하는 이메일 입력 후 회원가입 시도
이미 사용중인 이메일이기에 PlatformException(ERROR_EMAIL_ALREADY_IN_USE) 출력.
회원가입 스낵바
로그인 스낵바


소스코드 및 pubspec.yaml

// models/firebase_auth_state.dart

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

class FirebaseAuthState extends ChangeNotifier {
  // 기본값은 로그아웃 상태
  FirebaseAuthStatus _firebaseAuthStatus = FirebaseAuthStatus.signout;
  FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
  FirebaseUser _firebaseUser;

  void watchAuthChange() {
    // onAuthStateChanged를 통해 firebaseUser를 보냄.
    _firebaseAuth.onAuthStateChanged.listen((firebaseUser) {
      if (firebaseUser == null && _firebaseUser == null) {
        return;
      } else if (firebaseUser != _firebaseUser) {
        // 받아온 firebaseUser와 _firebaseUser가 같지 않으면
        // 업데이트.
        _firebaseUser = firebaseUser;
        // 업데이트 후 changeFirebaseAuthStatus() 실행.
        // firebaseAuthStatus 파라미터를 넣지 않았기에
        // else if로 바로 넘어감.
        changeFirebaseAuthStatus();
      }
    });
  }

  // 회원가입
  void registerUser(BuildContext context,
      {@required String email, @required String password}) {
    _firebaseAuth
        .createUserWithEmailAndPassword(
            email: email.trim(), password: password.trim())
        .catchError((error) {
      print(error);
      String _message = "";
      switch (error.code) {
        case "ERROR_WEAK_PASSWORD":
          _message = "패스워드를 확인해주세요.";
          break;
        case "ERROR_INVALID_EMAIL":
          _message = "이메일을 확인해주세요.";
          break;
        case "ERROR_EMAIL_ALREADY_IN_USE":
          _message = "이미 사용중인 이메일입니다.";
          break;
      }
      // 스낵바 출력
      SnackBar snackBar = SnackBar(content: Text(_message));
      Scaffold.of(context).showSnackBar(snackBar);
    });
  }

  // 로그인
  void login(BuildContext context,
      {@required String email, @required String password}) {
    _firebaseAuth
        .signInWithEmailAndPassword(
            email: email.trim(), password: password.trim())
        .catchError((error) {
      print(error);
      String _message = "";
      switch (error.code) {
        case 'ERROR_INVALID_EMAIL':
          _message = "아이디 또는 패스워드가 올바르지 않습니다.";
          break;
        case 'ERROR_WRONG_PASSWORD':
          _message = "아이디 또는 패스워드가 올바르지 않습니다.";
          break;
        case 'ERROR_USER_NOT_FOUND':
          _message = "해당 계정을 찾을 수 없습니다.";
          break;
        case 'ERROR_USER_DISABLED':
          _message = "해당 계정은 정지되었습니다.";
          break;
        case 'ERROR_TOO_MANY_REQUESTS':
          _message = "너무 많이 시도되었습니다. 나중에 다시 시도해주세요.";
          break;
        case 'ERROR_OPERATION_NOT_ALLOWED':
          _message = "올바른 시도가 아닙니다.";
          break;
      }
      SnackBar snackBar = SnackBar(content: Text(_message));
      Scaffold.of(context).showSnackBar(snackBar);
    });
  }

  // 로그아웃
  void signOut() {
    _firebaseAuthStatus = FirebaseAuthStatus.signout;
    if (_firebaseUser != null) {
      _firebaseUser = null;
      _firebaseAuth.signOut();
    }
    notifyListeners();
  }

  // [] -> 옵션
  void changeFirebaseAuthStatus([FirebaseAuthStatus firebaseAuthStatus]) {
    if (firebaseAuthStatus != null) {
      _firebaseAuthStatus = firebaseAuthStatus;
    } else if (_firebaseUser != null) {
      // 유저 데이터가 있으면 singin
      _firebaseAuthStatus = FirebaseAuthStatus.singin;
    } else {
      _firebaseAuthStatus = FirebaseAuthStatus.signout;
    }
    notifyListeners();
  }

  FirebaseAuthStatus get firebaseAuthStatus => _firebaseAuthStatus;
}

enum FirebaseAuthStatus { signout, progress, singin }
Comments