코딩하는 제리

[Flutter/Project](Instagram Clone) Firebase 상태 파일 변경 및 provider 적용 본문

Flutter/Project_InstaClone(완)

[Flutter/Project](Instagram Clone) Firebase 상태 파일 변경 및 provider 적용

JerryCho 2021. 2. 3. 12:44

firebase_auth_state.dart

listen: false -> 해당 위젯에 변화를 줄 필요가 없을 때 사용.

sign_in_form.dart, sign_up_form.dart 의 FlatButton에 모두 적용

 

profile_side_menu.dart

 

main.dart provider


소스코드 및 pubspec.yaml

firebase_auth 최신버전 오류 발생으로 다운그레이드

// 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 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 }
// main.dart

import 'package:flutter/material.dart';
import 'package:flutter_project_IJ/models/firebase_auth_state.dart';
import 'package:flutter_project_IJ/screens/auth_screen.dart';
import 'package:flutter_project_IJ/widgets/my_gallery.dart';
import 'package:flutter_project_IJ/widgets/my_progress_indicator.dart';
import 'package:provider/provider.dart';
import 'home_page.dart';
import 'constants/colors.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  FirebaseAuthState _firebaseAuthState = FirebaseAuthState();

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<FirebaseAuthState>.value(
      value: _firebaseAuthState,
      child: MaterialApp(
        home: Consumer<FirebaseAuthState>(
          builder: (BuildContext context, FirebaseAuthState firebaseAuthState,
              Widget child) {
            switch (firebaseAuthState.firebaseAuthStatus) {
              case FirebaseAuthStatus.signout:
                return AuthScreen();
              case FirebaseAuthStatus.progress:
                return MyProgressIndicator();
              case FirebaseAuthStatus.singin:
                return HomePage();
              default:
                return MyProgressIndicator();
            }
          },
          child: HomePage(),
        ),
        theme: ThemeData(primarySwatch: white),
      ),
    );
  }
}
Comments