🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    해결됨

riverpod으로 상태관리하기

24.05.23 20:33 작성 조회수 136

0

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

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

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

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

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

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

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

 

답변 1

답변을 작성해보세요.

1

AuthProvider 클래스에

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

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

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

빠른 답변 감사드립니다!

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

 

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

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

 

// 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,
      );
    }
  }

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

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

좋은밤되세요!

채널톡 아이콘