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),
|
|
);
|
|
},
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|