diff --git a/lib/assets_manager/cubit/assets_manager_cubit.dart b/lib/assets_manager/cubit/assets_manager_cubit.dart index eb0f7e31..e05aba21 100644 --- a/lib/assets_manager/cubit/assets_manager_cubit.dart +++ b/lib/assets_manager/cubit/assets_manager_cubit.dart @@ -31,8 +31,12 @@ class AssetsManagerCubit extends Cubit { ), ); final all = state.loadables.map((loadable) async { - await loadable; - emit(state.copyWith(loaded: [...state.loaded, loadable])); + try { + await loadable; + emit(state.copyWith(loaded: [...state.loaded, loadable])); + } catch (error, stackTrace) { + emit(state.copyWith(error: '$error')); + } }).toList(); await Future.wait(all); } diff --git a/lib/assets_manager/cubit/assets_manager_state.dart b/lib/assets_manager/cubit/assets_manager_state.dart index 4847adc6..f9ad3e9b 100644 --- a/lib/assets_manager/cubit/assets_manager_state.dart +++ b/lib/assets_manager/cubit/assets_manager_state.dart @@ -8,6 +8,7 @@ class AssetsManagerState extends Equatable { const AssetsManagerState({ required this.loadables, required this.loaded, + this.error, }); /// {@macro assets_manager_state} @@ -20,22 +21,26 @@ class AssetsManagerState extends Equatable { /// List of loaded futures final List loaded; + final String? error; + /// Returns a value between 0 and 1 to indicate the loading progress double get progress => loadables.isEmpty ? 0 : loaded.length / loadables.length; /// Only returns false if all the assets have been loaded - bool get isLoading => progress != 1; + bool get isLoading => progress != 1 && error == null; /// Returns a copy of this instance with the given parameters /// updated AssetsManagerState copyWith({ List? loadables, List? loaded, + String? error, }) { return AssetsManagerState( loadables: loadables ?? this.loadables, loaded: loaded ?? this.loaded, + error: error ?? this.error, ); } diff --git a/lib/assets_manager/views/assets_loading_page.dart b/lib/assets_manager/views/assets_loading_page.dart index 72476064..f2115a54 100644 --- a/lib/assets_manager/views/assets_loading_page.dart +++ b/lib/assets_manager/views/assets_loading_page.dart @@ -17,33 +17,38 @@ class AssetsLoadingPage extends StatelessWidget { Widget build(BuildContext context) { final l10n = context.l10n; final headline1 = Theme.of(context).textTheme.headline1; - return Container( - decoration: const CrtBackground(), - child: Center( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: Assets.images.loadingGame.ioPinball.image(), + return BlocBuilder( + builder: (context, state) { + return Container( + decoration: const CrtBackground(), + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Assets.images.loadingGame.ioPinball.image(), + ), + const SizedBox(height: 40), + AnimatedEllipsisText( + l10n.loading, + style: headline1, + ), + const SizedBox(height: 40), + FractionallySizedBox( + widthFactor: 0.8, + child: PinballLoadingIndicator(value: state.progress), + ), + if (state.error != null) + Text( + state.error!, + style: Theme.of(context).textTheme.headline4, + ), + ], ), - const SizedBox(height: 40), - AnimatedEllipsisText( - l10n.loading, - style: headline1, - ), - const SizedBox(height: 40), - FractionallySizedBox( - widthFactor: 0.8, - child: BlocBuilder( - builder: (context, state) { - return PinballLoadingIndicator(value: state.progress); - }, - ), - ), - ], - ), - ), + ), + ); + }, ); } } diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index b1f3c98a..be5ba3b3 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -111,7 +111,7 @@ class PinballGame extends PinballForge2DGame children: [ ZCanvasComponent( children: [ - if (!platformHelper.isMobile) ArcadeBackground(), + ArcadeBackground(), BoardBackgroundSpriteComponent(), Boundaries(), Backbox(