import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:user_repository/user_repository.dart'; part 'authentication_event.dart'; part 'authentication_state.dart'; class AuthenticationBloc extends Bloc { final UserRepository userRepository; late final StreamSubscription _userSubscription; AuthenticationBloc({ required this.userRepository }) : super(const AuthenticationState.unknown()) { _userSubscription = userRepository.user.listen((user) { add(AuthenticationUserChanged(user)); }); on((event, emit) { if(event.user != MyUser.empty) { emit(AuthenticationState.authenticated(event.user!)); } else { emit(AuthenticationState.unauthenticated()); } }); on((event, emit) async { try { await userRepository.logOut(); } catch (_) { // ignore errors here; stream will update state accordingly } }); } @override Future close() { _userSubscription.cancel(); return super.close(); } }