You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							259 lines
						
					
					
						
							9.0 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							259 lines
						
					
					
						
							9.0 KiB
						
					
					
				| import 'package:flutter/material.dart'; | |
| import 'package:flutter_bloc/flutter_bloc.dart'; | |
| import 'package:hadi_hoda_flutter/common_ui/resources/my_assets.dart'; | |
| import 'package:hadi_hoda_flutter/common_ui/resources/my_audios.dart'; | |
| import 'package:hadi_hoda_flutter/common_ui/resources/my_spaces.dart'; | |
| import 'package:hadi_hoda_flutter/core/utils/screen_size.dart'; | |
| import 'package:hadi_hoda_flutter/core/utils/set_platform_size.dart'; | |
| import 'package:hadi_hoda_flutter/core/widgets/images/my_image.dart'; | |
| import 'package:hadi_hoda_flutter/core/widgets/inkwell/my_inkwell.dart'; | |
| import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart'; | |
| import 'package:hadi_hoda_flutter/features/level/presentation/bloc/level_bloc.dart'; | |
| import 'package:hadi_hoda_flutter/features/level/presentation/bloc/level_event.dart'; | |
| import 'package:hadi_hoda_flutter/features/level/presentation/bloc/level_state.dart'; | |
| import 'package:hadi_hoda_flutter/features/level/presentation/ui/widgets/diamond_level.dart'; | |
| import 'package:hadi_hoda_flutter/features/level/presentation/ui/widgets/level_path.dart'; | |
| import 'package:hadi_hoda_flutter/features/level/presentation/ui/widgets/level_widget.dart'; | |
| import 'package:hadi_hoda_flutter/features/level/presentation/ui/widgets/play_button.dart'; | |
| 
 | |
| class LevelPage extends StatelessWidget { | |
|    const LevelPage({super.key}); | |
| 
 | |
| 
 | |
| 
 | |
|   @override | |
|   Widget build(BuildContext context) { | |
|     return Scaffold( | |
|       body: Stack( | |
|         alignment: Alignment.center, | |
|         children: [ | |
|           SingleChildScrollView( | |
|             controller: context.read<LevelBloc>().scrollController, | |
|             reverse: true, | |
|             child: Stack( | |
|               alignment: Alignment.center, | |
|               children: [ | |
|                 _background(), | |
|                 _path(context), | |
|                 _levelLocation(context), | |
|                 _planets(context), | |
|               ], | |
|             ), | |
|           ), | |
|           _topButtons(context), | |
|           _playButton(context) | |
|         ], | |
|       ), | |
|     ); | |
|   } | |
| 
 | |
|   Positioned _planets(BuildContext context) { | |
|     return Positioned.fill( | |
|       child: Stack( | |
|         alignment: Alignment.center, | |
|         children: [ | |
|           Positioned( | |
|             bottom: 0.3.h, | |
|             right: setSize(context: context, mobile: -40, tablet: -80), | |
|             child: MyImage( | |
|               image: MyAssets.planet1, | |
|               size: setSize(context: context, mobile: 180), | |
|             ), | |
|           ), | |
|           Positioned( | |
|             bottom: setSize(context: context, mobile: 0.65.h, tablet: 0.9.h), | |
|             child: MyImage( | |
|               image: MyAssets.planet2, | |
|               size: setSize(context: context, mobile: 110), | |
|             ), | |
|           ), | |
|           Positioned( | |
|             bottom: setSize(context: context, mobile: 0.8.h, tablet: 1.15.h), | |
|             left: setSize(context: context, mobile: -120, tablet: -200), | |
|             child: MyImage( | |
|               image: MyAssets.planet3, | |
|               size: setSize(context: context, mobile: 300), | |
|             ), | |
|           ), | |
|           Positioned( | |
|             bottom: setSize(context: context, mobile: 1.3.h, tablet: 1.75.h), | |
|             right: 40, | |
|             child: MyImage( | |
|               image: MyAssets.planet4, | |
|               size: setSize(context: context, mobile: 120), | |
|             ), | |
|           ), | |
|           Positioned( | |
|             bottom: setSize(context: context, mobile: 1.5.h, tablet: 2.0.h), | |
|             left: setSize(context: context, mobile: -130, tablet: -220), | |
|             child: MyImage( | |
|               image: MyAssets.planet5, | |
|               size: setSize(context: context, mobile: 300), | |
|             ), | |
|           ), | |
|           Positioned( | |
|             bottom: setSize(context: context, mobile: 1.85.h, tablet: 2.55.h), | |
|             right: setSize(context: context, mobile: 20, tablet: 20), | |
|             child: MyImage( | |
|               image: MyAssets.planet6, | |
|               size: setSize(context: context, mobile: 80), | |
|             ), | |
|           ), | |
|           Positioned( | |
|             bottom: setSize(context: context, mobile: 1.95.h, tablet: 2.6.h), | |
|             child: MyImage( | |
|               image: MyAssets.planet7, | |
|               size: setSize(context: context, mobile: 120), | |
|             ), | |
|           ), | |
|           Positioned( | |
|             bottom: setSize(context: context, mobile: 2.1.h, tablet: 2.8.h), | |
|             right: setSize(context: context, mobile: -50, tablet: -120), | |
|             child: MyImage( | |
|               image: MyAssets.planet8, | |
|               size: setSize(context: context, mobile: 250), | |
|             ), | |
|           ), | |
|           Positioned( | |
|             bottom: setSize(context: context, mobile: 2.3.h, tablet: 3.1.h), | |
|             left: -20, | |
|             child: MyImage( | |
|               image: MyAssets.planet9, | |
|               size: setSize(context: context, mobile: 100), | |
|             ), | |
|           ), | |
|           Positioned( | |
|             bottom: setSize(context: context, mobile: 2.5.h, tablet: 3.4.h), | |
|             child: MyImage( | |
|               image: MyAssets.planet10, | |
|               size: setSize(context: context, mobile: 60), | |
|             ), | |
|           ), | |
|           Positioned( | |
|             bottom: setSize(context: context, mobile: 2.55.h, tablet: 3.45.h), | |
|             right: 20, | |
|             child: MyImage( | |
|               image: MyAssets.satellite, | |
|               size: setSize(context: context, mobile: 80), | |
|             ), | |
|           ), | |
|           Positioned( | |
|             bottom: setSize(context: context, mobile: 2.6.h, tablet: 3.5.h), | |
|             left: setSize(context: context, mobile: 40), | |
|             child: MyImage( | |
|               image: MyAssets.planetFinal, | |
|               size: setSize(context: context, mobile: 300), | |
|             ), | |
|           ), | |
|         ], | |
|       ), | |
|     ); | |
|   } | |
| 
 | |
|   Positioned _path(BuildContext context) { | |
|     return Positioned.fill( | |
|       top: setSize(context: context, mobile: 0.3.h, tablet: 0.37.h), | |
|       bottom: setSize(context: context, mobile: 0.15.h, tablet: 200), | |
|       left: MySpaces.s30, | |
|       right: MySpaces.s30, | |
|       child: LevelPath( | |
|         width: setSize(context: context, tablet: 0.45.w, mobile: 0.9.w) ?? 0, | |
|         height: setSize(context: context, tablet: 1.75.h, mobile: 2.55.h) ?? 0, | |
|       ), | |
|     ); | |
|   } | |
| 
 | |
|    Widget _playButton(BuildContext context) { | |
|      return BlocBuilder<LevelBloc, LevelState>( | |
|          buildWhen: (previous, current) => | |
|          previous.chooseLevel?.id != current.chooseLevel?.id, | |
|          builder: (context, state) { | |
|            return Positioned( | |
|              bottom: MySpaces.s20, | |
|              child: PlayButton( | |
|                level: state.chooseLevel ?? LevelEntity(), | |
|                onTap: (level) => | |
|                    context.read<LevelBloc>().goToQuestionPage(context, level), | |
|              ), | |
|            ); | |
|          } | |
|      ); | |
|    } | |
| 
 | |
|   Positioned _topButtons(BuildContext context) { | |
|     return Positioned( | |
|       left: MySpaces.s16, | |
|       right: MySpaces.s16, | |
|       top: MySpaces.s20, | |
|       child: Row( | |
|         spacing: MySpaces.s16, | |
|         children: [ | |
|           MyInkwell( | |
|             onTap: () => context.read<LevelBloc>().goToHomePage(context), | |
|             audio: MyAudios.back, | |
|             child: MyImage( | |
|               image: MyAssets.homeButton, | |
|             ), | |
|           ), | |
|           Spacer(), | |
|           DiamondLevel(), | |
|           StreamBuilder<double>( | |
|             initialData: 1, | |
|             stream: context.read<LevelBloc>().volumeStream, | |
|             builder: (context, snapshot) => MyInkwell( | |
|               onTap: () => context.read<LevelBloc>().changeMute(), | |
|               child: MyImage( | |
|                 image: snapshot.data == 0 ? MyAssets.musicOff : MyAssets.musicOn, | |
|               ), | |
|             ), | |
|           ), | |
|         ], | |
|       ), | |
|     ); | |
|   } | |
| 
 | |
|   Widget _background() { | |
|     return Stack( | |
|       children: [ | |
|         MyImage( | |
|           image: MyAssets.mapBackground, | |
|           fit: BoxFit.cover, | |
|         ), | |
|       ], | |
|     ); | |
|   } | |
| 
 | |
|   Widget _levelLocation(BuildContext context) { | |
|     return BlocBuilder<LevelBloc, LevelState>( | |
|       builder: (context, state) => Positioned.fill( | |
|         child: Stack( | |
|           children: [ | |
|             ...List.generate( | |
|               context.read<LevelBloc>().levelList.length, | |
|               (index) => Positioned( | |
|                 top: context.read<LevelBloc>().locationList[index].top, | |
|                 bottom: context.read<LevelBloc>().locationList[index].bottom, | |
|                 right: context.read<LevelBloc>().locationList[index].right, | |
|                 left: context.read<LevelBloc>().locationList[index].left, | |
|                 child: BlocBuilder<LevelBloc, LevelState>( | |
|                   buildWhen: (previous, current) => | |
|                       previous.chooseLevel?.id != current.chooseLevel?.id, | |
|                   builder: (context, state) => LevelWidget( | |
|                     chooseLevel: state.chooseLevel, | |
|                     level: context.read<LevelBloc>().levelList[index], | |
|                     type: context.read<LevelBloc>().getLevelType(index + 1), | |
|                     onTap: (LevelEntity level, LevelType type) { | |
|                       context.read<LevelBloc>().add( | |
|                         ChooseLevelEvent(level, type), | |
|                       ); | |
|                     }, | |
|                   ), | |
|                 ), | |
|               ), | |
|             ), | |
|           ], | |
|         ), | |
|       ), | |
|     ); | |
|   } | |
| }
 |