코딩하는 제리

[Flutter/Project](Instagram Clone) Firebase 회원가입, 로그인 구현 본문

Flutter/Project_InstaClone(완)

[Flutter/Project](Instagram Clone) Firebase 회원가입, 로그인 구현

JerryCho 2021. 2. 4. 10:54


coding-jerry.tistory.com/66

 

[Flutter/Error] PlatformException 파이어베이스 로그인 에러 해결

이후 파이어베이스 프로젝트 설정 - 공개 설정 - 지원 이메일의 이메일 선택. 소스코드 및 pubspec.yaml

coding-jerry.tistory.com

회원가입 실행 후 디버그 콘솔
로그인 후 디버그 콘솔
로그아웃 후 디버그 콘솔
firebase_auth_state.dart
main.dart -> _firebaseAuthState.watchAuthChange(); 추가
sign_up_form.dart
sign_in_form.dart


소스코드 및 pubspec.yaml

// models/firebase_auth_state.dart

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/foundation.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({@required String email, @required String password}) {
    _firebaseAuth.createUserWithEmailAndPassword(
        email: email, password: password);
  }

  // 로그인
  void login({@required String email, @required String password}) {
    _firebaseAuth.signInWithEmailAndPassword(email: email, password: password);
  }

  // 로그아웃
  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