Browse Source

Merge pull request 'add: app life cycle observer' (#47) from fix/changes into develop

Reviewed-on: https://git.nwhco.ir/amirreza.chegini/hade_hoda_flutter/pulls/47
pull/48/head
amirreza.chegini 5 days ago
parent
commit
cd8589a499
  1. 32
      lib/core/utils/app_life_cycle.dart
  2. 12
      lib/features/question/presentation/bloc/question_bloc.dart
  3. 21
      lib/features/question/presentation/ui/screens/question_screen.dart
  4. 2
      lib/main.dart

32
lib/core/utils/app_life_cycle.dart

@ -0,0 +1,32 @@
import 'package:flutter/material.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 AppLifeCycleController extends WidgetsBindingObserver {
AppLifeCycleController() {
WidgetsBinding.instance.addObserver(this);
}
void dispose() {
WidgetsBinding.instance.removeObserver(this);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
final AudioService mainAudio = locator(
instanceName: MyConstants.mainAudioService,
);
final AudioService effect = locator(
instanceName: MyConstants.effectAudioService,
);
if (state == AppLifecycleState.paused || state == AppLifecycleState.inactive) {
mainAudio.pause();
effect.pause();
} else if (state == AppLifecycleState.resumed) {
mainAudio.play();
effect.play();
}
}
}

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

@ -236,6 +236,18 @@ class QuestionBloc extends Bloc<QuestionEvent, QuestionState> {
showAnswerSequence = show;
}
Future<void> pausePlaying() async {
await _mainAudioService.pause();
}
Future<void> pauseBackgroundPlaying() async {
await _backgroundAudioService.pause();
}
Future<void> playBackgroundPlaying() async {
await _backgroundAudioService.play();
}
/// ------------Event Calls------------
FutureOr<void> _getLevelEvent(GetLevelEvent event, Emitter<QuestionState> emit) async {
await _getLevelUseCase(QuestionParams(id: int.parse(event.id ?? '0'))).then(

21
lib/features/question/presentation/ui/screens/question_screen.dart

@ -34,11 +34,12 @@ class QuestionScreen extends StatefulWidget {
State<QuestionScreen> createState() => _QuestionScreenState();
}
class _QuestionScreenState extends State<QuestionScreen> with TickerProviderStateMixin {
class _QuestionScreenState extends State<QuestionScreen> with TickerProviderStateMixin, WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
context.read<QuestionBloc>().answerAnimationController = AnimationController(
vsync: this,
duration: Duration(milliseconds: 500),
@ -55,6 +56,22 @@ class _QuestionScreenState extends State<QuestionScreen> with TickerProviderStat
}
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
if(state == AppLifecycleState.paused || state == AppLifecycleState.inactive){
context.read<QuestionBloc>().pauseBackgroundPlaying();
} else if (state == AppLifecycleState.resumed) {
context.read<QuestionBloc>().playBackgroundPlaying();
}
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(
@ -145,6 +162,7 @@ class _QuestionScreenState extends State<QuestionScreen> with TickerProviderStat
itemCount: state.currentQuestion?.answers?.length ?? 0,
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
clipBehavior: Clip.none,
padding: EdgeInsets.symmetric(
horizontal: setSize(context: context, tablet: 70) ?? 0,
),
@ -219,6 +237,7 @@ class _QuestionScreenState extends State<QuestionScreen> with TickerProviderStat
context.read<QuestionBloc>().imageAnimationController.reverse();
context.read<QuestionBloc>().answerAnimationController.forward();
context.read<QuestionBloc>().showingAnswerSequence(show: false);
context.read<QuestionBloc>().pausePlaying();
},
style: TextButton.styleFrom(
foregroundColor: MyColors.white.withValues(alpha: 0.7),

2
lib/main.dart

@ -5,6 +5,7 @@ import 'package:hadi_hoda_flutter/common_ui/theme/my_theme.dart';
import 'package:hadi_hoda_flutter/common_ui/theme/theme_service.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/app_life_cycle.dart';
import 'package:hadi_hoda_flutter/core/utils/local_storage.dart';
import 'package:hadi_hoda_flutter/core/utils/my_device.dart';
import 'package:hadi_hoda_flutter/core/utils/storage_path.dart';
@ -17,6 +18,7 @@ import 'features/app/presentation/bloc/app_state.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
AppLifeCycleController();
initBindings();
await Future.wait([
LocalStorage.init(),

Loading…
Cancel
Save