Browse Source

Merge pull request 'feature/audio' (#31) from feature/audio into develop

Reviewed-on: https://git.nwhco.ir/amirreza.chegini/hade_hoda_flutter/pulls/31
develop
amirreza.chegini 16 hours ago
parent
commit
c04a328329
  1. BIN
      assets/audios/back.mp3
  2. BIN
      assets/audios/click_button.mp3
  3. BIN
      assets/audios/diamond_end.mp3
  4. BIN
      assets/audios/diamond_increase.mp3
  5. BIN
      assets/audios/home.mp3
  6. BIN
      assets/audios/incorrect_answer.mp3
  7. BIN
      assets/audios/question.mp3
  8. BIN
      assets/audios/right_answer.mp3
  9. 8
      lib/common_ui/resources/my_audios.dart
  10. 4
      lib/core/constants/my_constants.dart
  11. 12
      lib/core/middlewares/my_middlewares.dart
  12. 13
      lib/core/routers/my_routes.dart
  13. 51
      lib/core/services/audio_service.dart
  14. 5
      lib/core/widgets/button/my_blue_button.dart
  15. 3
      lib/core/widgets/button/my_yellow_button.dart
  16. 8
      lib/core/widgets/dialog/about_us_dialog.dart
  17. 104
      lib/core/widgets/dialog/exit_dialog.dart
  18. 4
      lib/core/widgets/dialog/hadith_dialog.dart
  19. 11
      lib/core/widgets/dialog/styles/dialog_background.dart
  20. 82
      lib/core/widgets/dialog/styles/dialog_button.dart
  21. 55
      lib/core/widgets/inkwell/my_inkwell.dart
  22. 34
      lib/features/home/presentation/bloc/home_bloc.dart
  23. 43
      lib/features/home/presentation/ui/home_page.dart
  24. 9
      lib/features/intro/presentation/bloc/intro_bloc.dart
  25. 6
      lib/features/language/presentation/bloc/language_bloc.dart
  26. 2
      lib/features/question/presentation/bloc/question_bloc.dart
  27. 9
      lib/init_bindings.dart
  28. 6
      lib/l10n/app_en.arb
  29. 24
      lib/l10n/app_localizations.dart
  30. 13
      lib/l10n/app_localizations_en.dart
  31. 1
      pubspec.yaml

BIN
assets/audios/back.mp3

BIN
assets/audios/click_button.mp3

BIN
assets/audios/diamond_end.mp3

BIN
assets/audios/diamond_increase.mp3

BIN
assets/audios/home.mp3

BIN
assets/audios/incorrect_answer.mp3

BIN
assets/audios/question.mp3

BIN
assets/audios/right_answer.mp3

8
lib/common_ui/resources/my_audios.dart

@ -0,0 +1,8 @@
class MyAudios {
static const MyAudios _i = MyAudios._internal();
const MyAudios._internal();
factory MyAudios() => _i;
static const String homeMusic = 'assets/audios/home.mp3';
static const String clickButton = 'assets/audios/click_button.mp3';
}

4
lib/core/constants/my_constants.dart

@ -13,4 +13,8 @@ class MyConstants {
static const String selectLanguage = 'SELECT_LANGUAGE';
static const String firstDownload = 'FIRST_DOWNLOAD';
static const String currentLevel = 'CURRENT_LEVEL';
static const String mainAudioService = 'MAIN_AUDIO_SERVICE';
static const String effectAudioService = 'EFFECT_AUDIO_SERVICE';
static const String firstIntro = 'FIRST_INTRO';
static const double mainAudioVolume = 0.3;
}

12
lib/core/middlewares/my_middlewares.dart

@ -11,7 +11,7 @@ class MyMiddlewares {
const MyMiddlewares._internal();
factory MyMiddlewares() => _i;
static FutureOr<String?> splash(BuildContext context, GoRouterState state) {
static FutureOr<String?> splash(BuildContext context, GoRouterState state) {
final String? firstDownload = LocalStorage.readData(
key: MyConstants.firstDownload);
if (firstDownload != 'true') {
@ -20,4 +20,14 @@ class MyMiddlewares {
return null;
}
}
static FutureOr<String?> intro(BuildContext context, GoRouterState state) {
final String? firstIntro = LocalStorage.readData(
key: MyConstants.firstIntro);
if (firstIntro == 'true') {
return Routes.levelPage;
} else {
return null;
}
}
}

13
lib/core/routers/my_routes.dart

@ -1,5 +1,6 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:hadi_hoda_flutter/core/constants/my_constants.dart';
import 'package:hadi_hoda_flutter/core/middlewares/my_middlewares.dart';
import 'package:hadi_hoda_flutter/core/utils/context_provider.dart';
import 'package:hadi_hoda_flutter/features/download/presentation/bloc/download_bloc.dart';
@ -46,6 +47,7 @@ GoRouter get appPages => GoRouter(
GoRoute(
name: Routes.introPage,
path: Routes.introPage,
redirect: MyMiddlewares.intro,
builder: (context, state) => BlocProvider(
create: (context) => IntroBloc(),
child: const IntroPage(),
@ -93,7 +95,10 @@ GoRouter get appPages => GoRouter(
name: Routes.homePage,
path: Routes.homePage,
builder: (context, state) => BlocProvider(
create: (context) => HomeBloc(locator()),
create: (context) =>
HomeBloc(locator(instanceName: MyConstants.mainAudioService),
locator(instanceName: MyConstants.effectAudioService),
),
child: const HomePage(),
),
),
@ -101,7 +106,11 @@ GoRouter get appPages => GoRouter(
name: Routes.levelPage,
path: Routes.levelPage,
builder: (context, state) => BlocProvider(
create: (context) => LevelBloc(locator(), locator())..add(SetCurrentLevelEvent()),
create: (context) =>
LevelBloc(
locator(),
locator(instanceName: MyConstants.mainAudioService),
)..add(SetCurrentLevelEvent()),
child: const LevelPage(),
),
),

51
lib/core/services/audio_service.dart

@ -3,21 +3,32 @@ import 'package:just_audio/just_audio.dart';
class AudioService {
final AudioPlayer _player = AudioPlayer();
final double? volume;
Future<Duration?> setAudio({String? filePath}) async {
AudioService({this.volume}) {
_player.setVolume(volume ?? 1);
}
Future<Duration?> setAudio({String? filePath, String? assetPath}) async {
try {
return _player.setAudioSource(AudioSource.file(filePath ?? ''));
if (filePath != null) {
return await _player.setAudioSource(AudioSource.file(filePath));
} else if (assetPath != null) {
return await _player.setAudioSource(AudioSource.asset(assetPath));
} else {
return null;
}
} catch (e) {
if (kDebugMode) {
print('$e');
}
return Duration.zero;
return null;
}
}
Future<void> play() async {
try {
return _player.play();
await _player.play();
} catch (e) {
if (kDebugMode) {
print('$e');
@ -27,7 +38,7 @@ class AudioService {
Future<void> pause() async {
try {
return _player.pause();
await _player.pause();
} catch (e) {
if (kDebugMode) {
print('$e');
@ -37,7 +48,7 @@ class AudioService {
Future<void> stop() async {
try {
return _player.stop();
await _player.stop();
} catch (e) {
if (kDebugMode) {
print('$e');
@ -47,7 +58,7 @@ class AudioService {
Future<void> dispose() async {
try {
return _player.dispose();
await _player.dispose();
} catch (e) {
if (kDebugMode) {
print('$e');
@ -58,7 +69,7 @@ class AudioService {
Future<void> changeMute() async {
try {
if (_player.volume == 0) {
await _player.setVolume(1);
await _player.setVolume(volume ?? 1);
} else {
await _player.setVolume(0);
}
@ -69,6 +80,16 @@ class AudioService {
}
}
Future<void> setVolume({required double volume}) async {
try {
await _player.setVolume(volume);
} catch (e) {
if (kDebugMode) {
print('$e');
}
}
}
Stream<double> volumeStream() async* {
try {
yield* _player.volumeStream;
@ -78,4 +99,18 @@ class AudioService {
}
}
}
Future<void> setLoopMode({bool isLoop = false}) async {
try {
if (isLoop) {
await _player.setLoopMode(LoopMode.all);
} else {
await _player.setLoopMode(LoopMode.off);
}
} catch (e) {
if (kDebugMode) {
print('$e');
}
}
}
}

5
lib/core/widgets/button/my_blue_button.dart

@ -5,6 +5,7 @@ import 'package:hadi_hoda_flutter/common_ui/resources/my_spaces.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_text_style.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';
class MyBlueButton extends StatelessWidget {
const MyBlueButton({
@ -20,7 +21,7 @@ class MyBlueButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return InkWell(
return MyInkwell(
onTap: onTap,
highlightColor: MyColors.transparent,
splashColor: MyColors.transparent,
@ -36,7 +37,7 @@ class MyBlueButton extends StatelessWidget {
'',
),
PositionedDirectional(
top: top ?? setSize(context: context, mobile: MySpaces.s10, tablet: MySpaces.s20),
top: top ?? setSize(context: context, mobile: MySpaces.s6, tablet: MySpaces.s20),
child: Text(
title ?? '',
style: MYTextStyle.button1.copyWith(

3
lib/core/widgets/button/my_yellow_button.dart

@ -5,6 +5,7 @@ import 'package:hadi_hoda_flutter/common_ui/resources/my_spaces.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_text_style.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';
class MyYellowButton extends StatelessWidget {
const MyYellowButton({
@ -20,7 +21,7 @@ class MyYellowButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return InkWell(
return MyInkwell(
onTap: onTap,
highlightColor: MyColors.transparent,
splashColor: MyColors.transparent,

8
lib/core/widgets/about_us_dialog/about_us_dialog.dart → lib/core/widgets/dialog/about_us_dialog.dart

@ -7,8 +7,9 @@ import 'package:hadi_hoda_flutter/common_ui/resources/my_colors.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_text_style.dart';
import 'package:hadi_hoda_flutter/core/utils/my_localization.dart';
import 'package:hadi_hoda_flutter/core/utils/set_platform_size.dart';
import 'package:hadi_hoda_flutter/core/widgets/about_us_dialog/styles/background.dart';
import 'package:hadi_hoda_flutter/core/widgets/dialog/styles/dialog_background.dart';
import 'package:hadi_hoda_flutter/core/widgets/images/my_image.dart';
import 'package:hadi_hoda_flutter/core/widgets/inkwell/my_inkwell.dart';
Future<void> showAboutUsDialog({required BuildContext context}) async {
await showDialog(
@ -40,7 +41,7 @@ class AboutUsDialog extends StatelessWidget {
child: Stack(
clipBehavior: Clip.none,
children: [
AboutUSDialogBackground(
DialogBackground(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
@ -91,9 +92,8 @@ class AboutUsDialog extends StatelessWidget {
Positioned(
right: setSize(context: context, mobile: 30, tablet: 40),
top: setSize(context: context, mobile: -12, tablet: -20),
child: GestureDetector(
child: MyInkwell(
onTap: context.pop,
behavior: HitTestBehavior.opaque,
child: MyImage(
image: MyAssets.closeBtn,
size: setSize(context: context, mobile: 40, tablet: 60),

104
lib/core/widgets/dialog/exit_dialog.dart

@ -0,0 +1,104 @@
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:go_router/go_router.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_colors.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_spaces.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_text_style.dart';
import 'package:hadi_hoda_flutter/core/utils/my_localization.dart';
import 'package:hadi_hoda_flutter/core/utils/set_platform_size.dart';
import 'package:hadi_hoda_flutter/core/widgets/dialog/styles/dialog_background.dart';
import 'package:hadi_hoda_flutter/core/widgets/dialog/styles/dialog_button.dart';
Future<void> showExitDialog({required BuildContext context}) async {
await showDialog(
context: context,
builder: (context) => ExitDialog(),
barrierColor: MyColors.purple.withValues(alpha: 0.82),
useSafeArea: false,
);
}
class ExitDialog extends StatelessWidget {
const ExitDialog({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: MyColors.transparent,
body: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 6, sigmaY: 6),
child: Center(
child: Padding(
padding: EdgeInsets.symmetric(
horizontal: setSize(context: context, mobile: 18, tablet: 160) ?? 0,
),
child: DialogBackground(
height: 260,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
context.translate.want_to_exit,
style: MYTextStyle.titr0.copyWith(color: Color(0XFF322386)),
),
Text(
context.translate.exit_dialog_desc,
style: MYTextStyle.titr3.copyWith(color: Color(0XFF6272A9)),
textAlign: TextAlign.center,
),
Row(
spacing: MySpaces.s20,
children: [
Expanded(
child: DialogButton(
onTap: () {
context.pop();
},
height: 72,
color: Color(0XFFC0BDD3),
child: Text(
context.translate.cancel,
style: MYTextStyle.button2.copyWith(
shadows: [
BoxShadow(
color: Color(0XFF9895AE),
offset: Offset(0, 3.32),
),
],
),
),
),
),
Expanded(
child: DialogButton(
onTap: () {
SystemNavigator.pop();
},
height: 72,
color: Color(0XFFD42427),
child: Text(
context.translate.exit,
style: MYTextStyle.button2.copyWith(
shadows: [
BoxShadow(
color: Color(0XFFC82020),
offset: Offset(0, 3.32),
),
],
),
),
),
),
],
),
],
),
),
),
),
),
);
}
}

4
lib/core/widgets/hadith_dialog/hadith_dialog.dart → lib/core/widgets/dialog/hadith_dialog.dart

@ -6,7 +6,7 @@ import 'package:hadi_hoda_flutter/common_ui/resources/my_assets.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_colors.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_spaces.dart';
import 'package:hadi_hoda_flutter/core/utils/set_platform_size.dart';
import 'package:hadi_hoda_flutter/core/widgets/about_us_dialog/styles/background.dart';
import 'package:hadi_hoda_flutter/core/widgets/dialog/styles/dialog_background.dart';
import 'package:hadi_hoda_flutter/core/widgets/images/my_image.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/hadith_entity.dart';
@ -45,7 +45,7 @@ class HadithDialog extends StatelessWidget {
child: Stack(
clipBehavior: Clip.none,
children: [
AboutUSDialogBackground(
DialogBackground(
child: ListView.separated(
itemCount: hadith.length,
separatorBuilder: (context, index) => Divider(

11
lib/core/widgets/about_us_dialog/styles/background.dart → lib/core/widgets/dialog/styles/dialog_background.dart

@ -3,10 +3,15 @@ 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';
class AboutUSDialogBackground extends StatelessWidget {
const AboutUSDialogBackground({super.key, this.child});
class DialogBackground extends StatelessWidget {
const DialogBackground({
super.key,
this.child,
this.height = 525,
});
final Widget? child;
final double height;
@override
Widget build(BuildContext context) {
@ -14,7 +19,7 @@ class AboutUSDialogBackground extends StatelessWidget {
clipper: _BottomShapeClipper(),
child: Container(
width: context.widthScreen,
height: 525,
height: height,
padding: EdgeInsets.symmetric(
vertical: MySpaces.s30,
horizontal: setSize(context: context, mobile: MySpaces.s30, tablet: 60) ?? 0,

82
lib/core/widgets/dialog/styles/dialog_button.dart

@ -0,0 +1,82 @@
import 'package:flutter/material.dart';
import 'package:hadi_hoda_flutter/core/widgets/inkwell/my_inkwell.dart';
class DialogButton extends StatelessWidget {
const DialogButton({
super.key,
this.color,
this.height = 72.0,
this.child,
this.onTap,
});
final Color? color;
final double height;
final Widget? child;
final VoidCallback? onTap;
@override
Widget build(BuildContext context) {
return ClipPath(
clipper: ButtonDialogClipper(),
child: Material(
type: MaterialType.transparency,
child: MyInkwell(
onTap: onTap,
child: Ink(
height: height,
color: color,
child: Center(
child: child,
),
),
),
),
);
}
}
class ButtonDialogClipper extends CustomClipper<Path> {
@override
Path getClip(Size size) {
final path = Path();
path.moveTo(size.width * 0.01841077, size.height * 0.8753694);
path.cubicTo(
size.width * 0.05368083,
size.height * 1.03396,
size.width * 0.888405,
size.height * 1.04665,
size.width * 0.961125,
size.height * 0.881918);
path.cubicTo(
size.width * 1.02749,
size.height * 0.732121,
size.width * 1.00029,
size.height * 0.195965,
size.width * 0.943774,
size.height * 0.0891425);
path.cubicTo(
size.width * 0.866786,
size.height * -0.0565611,
size.width * 0.122135,
size.height * -0.00478720,
size.width * 0.0598435,
size.height * 0.109607);
path.cubicTo(
size.width * 0.00172381,
size.height * 0.216429,
size.width * -0.0181157,
size.height * 0.711249,
size.width * 0.01841077,
size.height * 0.8753694);
path.close();
return path;
}
@override
bool shouldReclip(CustomClipper<Path> oldClipper) {
return true;
}
}

55
lib/core/widgets/inkwell/my_inkwell.dart

@ -0,0 +1,55 @@
import 'package:flutter/material.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_audios.dart';
import 'package:hadi_hoda_flutter/core/constants/my_constants.dart';
import 'package:hadi_hoda_flutter/core/services/audio_service.dart';
import 'package:hadi_hoda_flutter/init_bindings.dart';
class MyInkwell extends StatefulWidget {
const MyInkwell({
super.key,
this.onTap,
this.child,
this.borderRadius,
this.highlightColor,
this.splashColor,
});
final VoidCallback? onTap;
final Widget? child;
final BorderRadius? borderRadius;
final Color? highlightColor;
final Color? splashColor;
@override
State<MyInkwell> createState() => _MyInkwellState();
}
class _MyInkwellState extends State<MyInkwell> {
final AudioService audioService = locator(
instanceName: MyConstants.effectAudioService,
);
@override
void initState() {
super.initState();
}
void playAudio() {
audioService.setAudio(assetPath: MyAudios.clickButton);
audioService.play();
}
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () {
playAudio();
widget.onTap?.call();
},
borderRadius: widget.borderRadius,
highlightColor: widget.highlightColor,
splashColor: widget.splashColor,
child: widget.child,
);
}
}

34
lib/features/home/presentation/bloc/home_bloc.dart

@ -3,11 +3,14 @@ import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:flutter/cupertino.dart';
import 'package:go_router/go_router.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_audios.dart';
import 'package:hadi_hoda_flutter/core/constants/my_constants.dart';
import 'package:hadi_hoda_flutter/core/routers/my_routes.dart';
import 'package:hadi_hoda_flutter/core/services/audio_service.dart';
import 'package:hadi_hoda_flutter/core/utils/context_provider.dart';
import 'package:hadi_hoda_flutter/core/utils/local_storage.dart';
import 'package:hadi_hoda_flutter/core/widgets/about_us_dialog/about_us_dialog.dart';
import 'package:hadi_hoda_flutter/core/widgets/dialog/about_us_dialog.dart';
import 'package:hadi_hoda_flutter/core/widgets/dialog/exit_dialog.dart';
import 'package:hadi_hoda_flutter/features/home/presentation/bloc/home_event.dart';
import 'package:hadi_hoda_flutter/features/home/presentation/bloc/home_state.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/total_data_entity.dart';
@ -16,9 +19,11 @@ import 'package:hive/hive.dart';
class HomeBloc extends Bloc<HomeEvent, HomeState> {
/// ------------constructor------------
HomeBloc(
this._audioService,
this._mainAudioService,
this._effectAudioService,
) : super(const HomeState()) {
volumeStream = _audioService.volumeStream();
volumeStream = _mainAudioService.volumeStream();
playMusic();
on<GetHomeEvent>(_getHomeEvent);
}
@ -28,7 +33,8 @@ class HomeBloc extends Bloc<HomeEvent, HomeState> {
late final Stream<double> volumeStream;
/// ------------Controllers------------
final AudioService _audioService;
final AudioService _mainAudioService;
final AudioService _effectAudioService;
/// ------------Functions------------
void goToLevelPage(BuildContext context){
@ -39,7 +45,7 @@ class HomeBloc extends Bloc<HomeEvent, HomeState> {
orElse: () => TotalDataEntity(),
);
if (findData.levels?.isNotEmpty ?? false) {
context.pushNamed(Routes.levelPage);
context.pushNamed(Routes.introPage);
} else {
context.goNamed(Routes.downloadPage);
}
@ -54,8 +60,24 @@ class HomeBloc extends Bloc<HomeEvent, HomeState> {
}
Future<void> changeMute() async {
await _audioService.changeMute();
await Future.wait([
_mainAudioService.changeMute(),
_effectAudioService.changeMute(),
]);
}
Future<void> playMusic() async {
Future.wait([
_mainAudioService.setAudio(assetPath: MyAudios.homeMusic),
_mainAudioService.setLoopMode(isLoop: true),
]);
await _mainAudioService.play();
}
void onPopInvokedWithResult(bool didPop, dynamic result) {
showExitDialog(context: ContextProvider.context);
}
/// ------------Api Calls------------
FutureOr<void> _getHomeEvent(event, emit) async {}
}

43
lib/features/home/presentation/ui/home_page.dart

@ -7,6 +7,7 @@ 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/button/my_yellow_button.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/home/presentation/bloc/home_bloc.dart';
class HomePage extends StatelessWidget {
@ -15,21 +16,27 @@ class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: DecoratedBox(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(MyAssets.backgroundHome),
fit: BoxFit.cover,
body: PopScope(
canPop: false,
onPopInvokedWithResult: context
.read<HomeBloc>()
.onPopInvokedWithResult,
child: DecoratedBox(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(MyAssets.backgroundHome),
fit: BoxFit.cover,
),
),
),
child: SizedBox.expand(
child: Stack(
alignment: Alignment.center,
children: [
_music(context),
_image(context),
_bottomBtns(context),
],
child: SizedBox.expand(
child: Stack(
alignment: Alignment.center,
children: [
_music(context),
_image(context),
_bottomBtns(context),
],
),
),
),
),
@ -43,10 +50,10 @@ class HomePage extends StatelessWidget {
child: StreamBuilder<double>(
initialData: 1,
stream: context.read<HomeBloc>().volumeStream,
builder: (context, snapshot) => InkWell(
builder: (context, snapshot) => MyInkwell(
onTap: () => context.read<HomeBloc>().changeMute(),
child: MyImage(
image: snapshot.data == 1 ? MyAssets.musicOn : MyAssets.musicOff,
image: snapshot.data == 0 ? MyAssets.musicOff : MyAssets.musicOn,
size: setSize(context: context, tablet: 100),
),
),
@ -84,7 +91,7 @@ class HomePage extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
InkWell(
MyInkwell(
onTap: () => context.read<HomeBloc>().goToLanguagePage(context),
child: MyImage(
image: MyAssets.language,
@ -95,7 +102,7 @@ class HomePage extends StatelessWidget {
onTap: () => context.read<HomeBloc>().goToLevelPage(context),
title: context.translate.start,
),
InkWell(
MyInkwell(
onTap: () => context.read<HomeBloc>().showAboutUs(context),
child: MyImage(
image: MyAssets.theme,

9
lib/features/intro/presentation/bloc/intro_bloc.dart

@ -3,8 +3,10 @@ import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:flutter/cupertino.dart';
import 'package:go_router/go_router.dart';
import 'package:hadi_hoda_flutter/core/constants/my_constants.dart';
import 'package:hadi_hoda_flutter/core/routers/my_routes.dart';
import 'package:hadi_hoda_flutter/core/utils/context_provider.dart';
import 'package:hadi_hoda_flutter/core/utils/local_storage.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_event.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_state.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/ui/screens/intro_1_screen.dart';
@ -33,8 +35,11 @@ class IntroBloc extends Bloc<IntroEvent, IntroState> {
/// ------------Controllers------------
/// ------------Functions------------
void goToLevelPage(){
ContextProvider.context.go(Routes.levelPage);
Future<void> goToLevelPage() async {
await LocalStorage.saveData(key: MyConstants.firstIntro, value: 'true');
if (ContextProvider.context.mounted) {
ContextProvider.context.replaceNamed(Routes.levelPage);
}
}
/// ------------Api Calls------------

6
lib/features/language/presentation/bloc/language_bloc.dart

@ -52,7 +52,11 @@ class LanguageBloc extends Bloc<LanguageEvent, LanguageState> {
]);
if (Directory(
'${StoragePath.documentDir.path}/${state.selectedLang.code}/audio')
'${StoragePath.documentDir.path}/${state.selectedLang
.code}/answer_audio')
.existsSync() && Directory(
'${StoragePath.documentDir.path}/${state.selectedLang
.code}/question_audio')
.existsSync()) {
if (ContextProvider.context.mounted) {
ContextProvider.context.goNamed(Routes.homePage);

2
lib/features/question/presentation/bloc/question_bloc.dart

@ -12,7 +12,7 @@ import 'package:hadi_hoda_flutter/core/services/audio_service.dart';
import 'package:hadi_hoda_flutter/core/status/base_status.dart';
import 'package:hadi_hoda_flutter/core/utils/context_provider.dart';
import 'package:hadi_hoda_flutter/core/utils/local_storage.dart';
import 'package:hadi_hoda_flutter/core/widgets/hadith_dialog/hadith_dialog.dart';
import 'package:hadi_hoda_flutter/core/widgets/dialog/hadith_dialog.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/answer_entity.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/question_entity.dart';

9
lib/init_bindings.dart

@ -39,7 +39,14 @@ final GetIt locator = GetIt.I;
void initBindings() {
/// Classes
locator.registerSingleton<IHttpRequest>(HttpRequestImpl());
locator.registerSingleton<AudioService>(AudioService());
locator.registerSingleton<AudioService>(
AudioService(volume: MyConstants.mainAudioVolume),
instanceName: MyConstants.mainAudioService,
);
locator.registerSingleton<AudioService>(
AudioService(),
instanceName: MyConstants.effectAudioService,
);
/// Sample Feature
locator.registerLazySingleton<ISampleDatasource>(() => SampleDatasourceImpl(locator()));

6
lib/l10n/app_en.arb

@ -24,5 +24,9 @@
"intro_2": "The purity of faith... \nIt means cleanliness is a sign of faith!",
"intro_3": "These good deeds make our souls strong and beautiful!",
"intro_4": "Do you want to travel to the Promised Garden?",
"intro_5": "Yessss....\nWe are ready!"
"intro_5": "Yessss....\nWe are ready!",
"want_to_exit": "Want To Exit?",
"exit_dialog_desc": "Come back, hero!\nThe adventure isn’t over yet",
"cancel": "Cancel",
"exit": "Exit"
}

24
lib/l10n/app_localizations.dart

@ -249,6 +249,30 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Yessss....\nWe are ready!'**
String get intro_5;
/// No description provided for @want_to_exit.
///
/// In en, this message translates to:
/// **'Want To Exit?'**
String get want_to_exit;
/// No description provided for @exit_dialog_desc.
///
/// In en, this message translates to:
/// **'Come back, hero!\nThe adventure isn’t over yet'**
String get exit_dialog_desc;
/// No description provided for @cancel.
///
/// In en, this message translates to:
/// **'Cancel'**
String get cancel;
/// No description provided for @exit.
///
/// In en, this message translates to:
/// **'Exit'**
String get exit;
}
class _AppLocalizationsDelegate

13
lib/l10n/app_localizations_en.dart

@ -90,4 +90,17 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get intro_5 => 'Yessss....\nWe are ready!';
@override
String get want_to_exit => 'Want To Exit?';
@override
String get exit_dialog_desc =>
'Come back, hero!\nThe adventure isn’t over yet';
@override
String get cancel => 'Cancel';
@override
String get exit => 'Exit';
}

1
pubspec.yaml

@ -47,6 +47,7 @@ flutter:
- assets/fonts/
- assets/images/
- assets/animations/
- assets/audios/
- path: assets/svg/
transformers:
- package: vector_graphics_compiler

Loading…
Cancel
Save