해결된 질문
작성
·
228
0
안녕하세요 선생님, 강의 흥미롭게 잘 듣고 있습니다.
저는 Provider에 대한 지식이 없어 제가 알고있던 riverpod을 사용하여 프로젝트를 진행하고 있었습니다.
그런데 이 강의의 update함수를 override하여 인증상태를 관리하는 부분에서 막혔습니다.
riverpod의 StateNotifer에는 해당 기능이 없더라구요..
(FirebaseAuth.instance.userChanges()에 따라서 state를 변경시키는 부분.)
혹시 만약 riverpod을 사용한다면 어떤 방향으로 코딩을해야할까요?
답변주시면 감사하겠습니다!
답변 1
1
AuthProvider 클래스에
User 객체를 파라메터로 전달받는 함수를 선언하고
update 함수와 동일한 로직을 작성 (final user = watch<User?>(); 로직은 제외)
생성자에 ref.listen 을 사용해서 상태관리 데이터로 등록한 User 객체가 변경될 경우,
1번에서 선언한 함수를 호출하는 로직 작성
이렇게 작성하면 되지 않을까 생각은 합니다.
프로젝트 파일을 보내주시면 한 번 확인해보겠습니다.
아래 코드로 구동해보시기 바랍니다.
테스트는 해보지 않아서 에러가 발생할 수 있습니다.
// 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 함수를 선언했어야 하는데 자꾸 이상한 곳에 선언했네요...
늦은밤까지 답변주셔서 감사합니다!
좋은밤되세요!
빠른 답변 감사드립니다!
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