From 53ec56aaa2b77cc33cc08a213b4fa74ba65e5b35 Mon Sep 17 00:00:00 2001 From: fluttermiddlepodcast Date: Tue, 27 Jan 2026 13:56:29 +0300 Subject: [PATCH] added BlocObserver example --- lib/core/bloc/custom_bloc_observer.dart | 48 +++++++++++++++++++ .../profile/bloc/profile_bloc_event.dart | 5 ++ .../profile/bloc/profile_bloc_state.dart | 15 ++++++ lib/features/profile/model/profile.dart | 5 ++ lib/features/users/bloc/users_bloc_state.dart | 20 ++++++++ lib/main.dart | 2 + 6 files changed, 95 insertions(+) create mode 100644 lib/core/bloc/custom_bloc_observer.dart diff --git a/lib/core/bloc/custom_bloc_observer.dart b/lib/core/bloc/custom_bloc_observer.dart new file mode 100644 index 0000000..2e69660 --- /dev/null +++ b/lib/core/bloc/custom_bloc_observer.dart @@ -0,0 +1,48 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class CustomBlocObserver extends BlocObserver { + const CustomBlocObserver(); + + @override + void onCreate(BlocBase bloc) { + debugPrint('--- ${bloc.runtimeType} created'); + + super.onCreate(bloc); + } + + @override + void onEvent(Bloc bloc, Object? event) { + debugPrint('--- ${bloc.runtimeType} received event: $event'); + + super.onEvent(bloc, event); + } + + @override + void onChange(BlocBase bloc, Change change) { + debugPrint('--- ${bloc.runtimeType} changed state: $change'); + + super.onChange(bloc, change); + } + + @override + void onTransition(Bloc bloc, Transition transition) { + debugPrint('--- ${bloc.runtimeType} moved to: $transition'); + + super.onTransition(bloc, transition); + } + + @override + void onError(BlocBase bloc, Object error, StackTrace stackTrace) { + debugPrint('--- Error in ${bloc.runtimeType}: $error'); + + super.onError(bloc, error, stackTrace); + } + + @override + void onClose(BlocBase bloc) { + debugPrint('--- ${bloc.runtimeType} closed'); + + super.onClose(bloc); + } +} diff --git a/lib/features/profile/bloc/profile_bloc_event.dart b/lib/features/profile/bloc/profile_bloc_event.dart index 069d221..01711d7 100644 --- a/lib/features/profile/bloc/profile_bloc_event.dart +++ b/lib/features/profile/bloc/profile_bloc_event.dart @@ -6,6 +6,11 @@ class ProfileBlocEventFetch extends ProfileBlocEvent { ProfileBlocEventFetch({ required this.isLogIn, }); + + @override + String toString() { + return 'ProfileBlocEventFetch{isLogIn: $isLogIn}'; + } } class ProfileBlocEventLogIn extends ProfileBlocEvent {} diff --git a/lib/features/profile/bloc/profile_bloc_state.dart b/lib/features/profile/bloc/profile_bloc_state.dart index 943955d..2a34c99 100644 --- a/lib/features/profile/bloc/profile_bloc_state.dart +++ b/lib/features/profile/bloc/profile_bloc_state.dart @@ -9,6 +9,11 @@ class ProfileBlocStateLoading extends ProfileBlocState { @override int get hashCode => runtimeType.hashCode; + + @override + String toString() { + return 'ProfileBlocStateLoading{}'; + } } class ProfileBlocStateLoaded extends ProfileBlocState { @@ -30,6 +35,11 @@ class ProfileBlocStateLoaded extends ProfileBlocState { @override int get hashCode => Object.hash(profile, isLoggedIn); + + @override + String toString() { + return 'ProfileBlocStateLoaded{profile: $profile, isLoggedIn: $isLoggedIn}'; + } } class ProfileBlocStateError extends ProfileBlocState { @@ -46,4 +56,9 @@ class ProfileBlocStateError extends ProfileBlocState { @override int get hashCode => error.hashCode; + + @override + String toString() { + return 'ProfileBlocStateError{error: $error}'; + } } diff --git a/lib/features/profile/model/profile.dart b/lib/features/profile/model/profile.dart index c60236b..bd3f231 100644 --- a/lib/features/profile/model/profile.dart +++ b/lib/features/profile/model/profile.dart @@ -26,4 +26,9 @@ class Profile { @override int get hashCode => firstName.hashCode ^ lastName.hashCode; + + @override + String toString() { + return 'Profile{firstName: $firstName, lastName: $lastName}'; + } } diff --git a/lib/features/users/bloc/users_bloc_state.dart b/lib/features/users/bloc/users_bloc_state.dart index cd564a6..d7a97fe 100644 --- a/lib/features/users/bloc/users_bloc_state.dart +++ b/lib/features/users/bloc/users_bloc_state.dart @@ -12,6 +12,11 @@ sealed class UsersBlocState { @override int get hashCode => runtimeType.hashCode; + + @override + String toString() { + return 'UsersBlocState{}'; + } } class UsersBlocStateLoading extends UsersBlocState { @@ -23,6 +28,11 @@ class UsersBlocStateLoading extends UsersBlocState { @override int get hashCode => runtimeType.hashCode; + + @override + String toString() { + return 'UsersBlocStateLoading{}'; + } } class UsersBlocStateLoaded extends UsersBlocState { @@ -53,6 +63,11 @@ class UsersBlocStateLoaded extends UsersBlocState { page, ); } + + @override + String toString() { + return 'UsersBlocStateLoaded{users (count): ${users.length}, canLoadMore: $canLoadMore, page: $page}'; + } } class UsersBlocStateError extends UsersBlocState { @@ -69,4 +84,9 @@ class UsersBlocStateError extends UsersBlocState { @override int get hashCode => error.hashCode; + + @override + String toString() { + return 'UsersBlocStateError{error: $error}'; + } } diff --git a/lib/main.dart b/lib/main.dart index 432710e..a11b960 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,3 +1,4 @@ +import 'package:bloc_example/core/bloc/custom_bloc_observer.dart'; import 'package:bloc_example/core/di/di.dart'; import 'package:bloc_example/features/home/home_page.dart'; import 'package:bloc_example/features/profile/bloc/profile_bloc.dart'; @@ -9,6 +10,7 @@ import 'package:path_provider/path_provider.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); + Bloc.observer = const CustomBlocObserver(); HydratedBloc.storage = await HydratedStorage.build( storageDirectory: kIsWeb ? HydratedStorageDirectory.web