Browse Source

add: audio background to home

pull/31/head
AmirrezaChegini 19 hours ago
parent
commit
a2c3556a7f
  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. 3
      lib/core/constants/my_constants.dart
  11. 12
      lib/core/routers/my_routes.dart
  12. 51
      lib/core/services/audio_service.dart
  13. 33
      lib/features/home/presentation/bloc/home_bloc.dart
  14. 2
      lib/features/home/presentation/ui/home_page.dart
  15. 9
      lib/init_bindings.dart
  16. 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';
}

3
lib/core/constants/my_constants.dart

@ -13,4 +13,7 @@ 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 double mainAudioVolume = 0.5;
}

12
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';
@ -93,7 +94,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 +105,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');
}
}
}
}

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

@ -3,6 +3,7 @@ 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';
@ -16,9 +17,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,10 +31,12 @@ 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){
playEffect();
final String? selectedLanguage = LocalStorage.readData(key: MyConstants.selectLanguage);
final Box<TotalDataEntity> dataBox = Hive.box(MyConstants.levelBox);
final TotalDataEntity findData = dataBox.values.singleWhere(
@ -46,16 +51,36 @@ class HomeBloc extends Bloc<HomeEvent, HomeState> {
}
void goToLanguagePage(BuildContext context){
playEffect();
context.pushNamed(Routes.languagePage);
}
void showAboutUs(BuildContext context){
playEffect();
showAboutUsDialog(context: context);
}
Future<void> changeMute() async {
await _audioService.changeMute();
playEffect();
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();
}
Future<void> playEffect() async{
await _effectAudioService.setAudio(assetPath: MyAudios.clickButton);
await _effectAudioService.play();
}
/// ------------Api Calls------------
FutureOr<void> _getHomeEvent(event, emit) async {}
}

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

@ -46,7 +46,7 @@ class HomePage extends StatelessWidget {
builder: (context, snapshot) => InkWell(
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),
),
),

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()));

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