코딩하는 제리

[Flutter/Project](Instagram Clone) Firebase 로그아웃 구현 본문

Flutter/Project_InstaClone(완)

[Flutter/Project](Instagram Clone) Firebase 로그아웃 구현

JerryCho 2021. 2. 3. 15:23

firebase_auth_state.dart
widgets/profile_side_menu.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 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