본문 바로가기
Flutter

Flutter Error: StreamProvider not updating when user signs out or signs in

by 난타코다옹 2023. 10. 16.

오류 메시지: but failed with the following error:. 에러 메시지가 명확하지 않으므로 추가적인 정보가 필요합니다.

원인: 코드에서는 사용자가 로그인 또는 로그아웃할 때 StreamProvider를 사용하여 사용자 데이터를 업데이트하려고 합니다. 그러나, 이것은 올바르게 작동하지 않아요. StreamProvider는 사용자 데이터를 업데이트하지 않고 이전 데이터를 계속 사용하고 있어요. 이것은 Firebase의 스트림이 업데이트되어도 StreamProvider가 업데이트되지 않는 이유일 수 있어요.

해결: StreamProvider를 업데이트하려면 StreamProvider를 사용하여 제공된 데이터의 변경을 감지해야 합니다. 그렇게 하기 위해서는 StreamProvider를 구독하고, 사용자가 로그인 또는 로그아웃할 때 스트림을 업데이트해야 합니다. 이것은 AuthenticationProvider 클래스에서 구독자를 사용하여 구현할 수 있어요.

class AuthenticationProvider {
  ...
  final _userController = StreamController<UserModel>.broadcast();

  Stream<UserModel> get currentUser => _userController.stream;

  void dispose() {
    _userController.close();
  }

  Future<void> signIn({required String email, required String password}) async {
    ...
    _userController.add(userModel);
    ...
  }

  Future<void> signOut() async {
    ...
    _userController.add(null);
    ...
  }
}

그리고, StreamProvider를 사용하여 AuthenticationProvider 클래스를 제공하면 됩니다.

void main() async {
  ...
  final AuthenticationProvider authenticationProvider = AuthenticationProvider();
  await authenticationProvider.initialize();
  runApp(
    MultiProvider(
      providers: [
        Provider<AuthenticationProvider>(create: (_) => authenticationProvider),
        StreamProvider<UserModel>(
          create: (_) => authenticationProvider.currentUser,
          initialData: UserModel(
            id: '',
            email: '',
            displayName: '',
            photo: null,
            premium: false,
            travels: [],
          ),
        )
      ],
      child: MiRoulotte(),
    ),
  );
}

분석: 위 코드에서는 StreamController를 사용하여 사용자 데이터를 업데이트합니다. 이것은 StreamProvider가 데이터 변경을 감지하고 업데이트할 수 있도록 합니다. 또한, dispose() 메서드를 사용하여 StreamController를 닫아 메모리 누수를 방지합니다.

*결론: * Firebase와 StreamProvider를 사용하여 Flutter 애플리케이션에서 사용자 데이터를 업데이트하는 것은 매우 일반적인 작업입니다. 그러나, 데이터가 업데이트되지 않는 문제가 발생할 수 있습니다. 이 문제를 해결하려면 StreamProvider를 구독하고, 사용자 데이터가 변경될 때마다 업데이트해야 합니다. 이를 위해 StreamController를 사용하여 업데이트를 수행할 수 있습니다.