From 161bc0a563e0ad999eb05fd9e68f2d88ef376a7a Mon Sep 17 00:00:00 2001 From: Erick Zanardo Date: Wed, 13 May 2026 10:19:59 -0300 Subject: [PATCH] fix: Bloc instance was null on initial state --- .../lib/src/flame_bloc_listenable.dart | 5 +++- .../test/src/flame_bloc_listenable_test.dart | 27 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/packages/flame_bloc/lib/src/flame_bloc_listenable.dart b/packages/flame_bloc/lib/src/flame_bloc_listenable.dart index 5138e0cbf31..d991ed1c248 100644 --- a/packages/flame_bloc/lib/src/flame_bloc_listenable.dart +++ b/packages/flame_bloc/lib/src/flame_bloc_listenable.dart @@ -11,12 +11,13 @@ mixin FlameBlocListenable, S> on Component { late StreamSubscription _subscription; late B _bloc; B? _blocOverride; + bool _blocInitialized = false; /// Returns the bloc that this component is reading from once the component /// has been mounted. B get bloc { assert( - isMounted, + _blocInitialized, 'Cannot access the bloc instance before it has been mounted.', ); return _bloc; @@ -49,6 +50,7 @@ mixin FlameBlocListenable, S> on Component { _blocOverride = bloc = provider.bloc; } _bloc = bloc; + _blocInitialized = true; _state = bloc.state; onInitialState(_state); _subscription = bloc.stream.listen((newState) { @@ -84,5 +86,6 @@ mixin FlameBlocListenable, S> on Component { void onRemove() { super.onRemove(); _subscription.cancel(); + _blocInitialized = false; } } diff --git a/packages/flame_bloc/test/src/flame_bloc_listenable_test.dart b/packages/flame_bloc/test/src/flame_bloc_listenable_test.dart index b3af47acd79..cdd618c2f63 100644 --- a/packages/flame_bloc/test/src/flame_bloc_listenable_test.dart +++ b/packages/flame_bloc/test/src/flame_bloc_listenable_test.dart @@ -49,6 +49,17 @@ class _SadPlayerListener extends Component } } +class _BlocAccessingListener extends Component + with FlameBlocListenable { + PlayerCubit? initialBloc; + + @override + void onInitialState(PlayerState state) { + super.onInitialState(state); + initialBloc = bloc; + } +} + void main() { group('FlameBlocListenable', () { testWithFlameGame( @@ -130,6 +141,22 @@ void main() { }, ); + testWithFlameGame( + 'can access bloc in onInitialState', + (game) async { + final bloc = PlayerCubit(); + final provider = FlameBlocProvider.value( + value: bloc, + ); + await game.ensureAdd(provider); + + final component = _BlocAccessingListener(); + await provider.ensureAdd(component); + + expect(component.initialBloc, bloc); + }, + ); + testWithFlameGame( 'successfully revisit previously visited route with bloc listener', (game) async {