인프런 커뮤니티 질문&답변

kimmeanseo01님의 프로필 이미지
kimmeanseo01

작성한 질문수

Flutter로 SNS 앱 만들기

Firebase Auth 인증 상태에 따라 AuthStatus 상태 변경

riverpod으로 상태관리하기

해결된 질문

작성

·

228

0

안녕하세요 선생님, 강의 흥미롭게 잘 듣고 있습니다.

저는 Provider에 대한 지식이 없어 제가 알고있던 riverpod을 사용하여 프로젝트를 진행하고 있었습니다.

그런데 이 강의의 update함수를 override하여 인증상태를 관리하는 부분에서 막혔습니다.

riverpod의 StateNotifer에는 해당 기능이 없더라구요..

(FirebaseAuth.instance.userChanges()에 따라서 state를 변경시키는 부분.)

혹시 만약 riverpod을 사용한다면 어떤 방향으로 코딩을해야할까요?

답변주시면 감사하겠습니다!

 

답변 1

1

DEV MOO님의 프로필 이미지
DEV MOO
지식공유자

AuthProvider 클래스에

  1. User 객체를 파라메터로 전달받는 함수를 선언하고
    update 함수와 동일한 로직을 작성 (final user = watch<User?>(); 로직은 제외)

  2. 생성자에 ref.listen 을 사용해서 상태관리 데이터로 등록한 User 객체가 변경될 경우,
    1번에서 선언한 함수를 호출하는 로직 작성

    이렇게 작성하면 되지 않을까 생각은 합니다.
    프로젝트 파일을 보내주시면 한 번 확인해보겠습니다.

kimmeanseo01님의 프로필 이미지
kimmeanseo01
질문자

빠른 답변 감사드립니다!

ref.listen함수에 <User?>를 반환하는 streamProvider를 넣으려고 했는데 빨간불 들어오면서 안들어가지네요...ㅜㅜ 한번만 더 확인 부탁드립니다!

에러내용은 다음과 같습니다.

The argument type 'StreamProvider<User?>' can't be assigned to the parameter type 'AlwaysAliveProviderListenable<User?>'.

https://github.com/minseo-flutter/flutter_study.git

 

DEV MOO님의 프로필 이미지
DEV MOO
지식공유자

프로젝트 전체를 압축해서
gobackad001@gmail.com 로 보내주시면 감사하겠습니다.

DEV MOO님의 프로필 이미지
DEV MOO
지식공유자

아래 코드로 구동해보시기 바랍니다.
테스트는 해보지 않아서 에러가 발생할 수 있습니다.

 

// AuthStateNotifier 가 Notifier 를 상속하므로 NotifierProvider 를 사용해야 합니다.
final authStateProvider = NotifierProvider<AuthStateNotifier, AuthState>(() => AuthStateNotifier());

// StateNotifier 대신 Notifier 를 사용하는 것을 추천
// StateNotifier 는 이제 레거시 코드입니다.
// StateNotifier 와 기능과 용도는 동일합니다.
// Notifier 를 상속하면 Ref 를 전달받지 않아도 사용할 수 있습니다.
class AuthStateNotifier extends Notifier<AuthState> {
  late AuthRepository authRepository;

  // build 함수는 생성자 역할을 합니다.
  @override
  AuthState build() {
    authRepository = ref.watch(authRepositoryProvider);
    ref.listen(authStreamProvider, (previous, next) {
      update(user: next.value);
    });
    return AuthState.init();
  }

  void update({
    required User? user,
  }) {
    if (user != null && !user.emailVerified) {
      return;
    }

    if (user == null && state.authStatus == AuthStatus.unauthenticated) {
      return;
    }

    if (user != null) {
      state = state.copyWith(
        authStatus: AuthStatus.authenticated,
      );
    } else {
      state = state.copyWith(
        authStatus: AuthStatus.unauthenticated,
      );
    }
  }
kimmeanseo01님의 프로필 이미지
kimmeanseo01
질문자

선생님 답변을 곰곰히 생각해보고 여러번 시도했더니 해결되었습니다! 생성자에 ref.listen 함수를 선언했어야 하는데 자꾸 이상한 곳에 선언했네요...

늦은밤까지 답변주셔서 감사합니다!

좋은밤되세요!

kimmeanseo01님의 프로필 이미지
kimmeanseo01

작성한 질문수

질문하기